按Java中的值过滤地图?

时间:2018-05-12 15:45:40

标签: java object filter hashmap java-stream

我的地图的值为GregorianCalendar / String,密钥为Reminder / Contact

private final Map<Object, Object> elements = new HashMap<>();

另一个清单:

List<Reminder> result = new ArrayList<Reminder>

我想过滤地图并按提醒主题创建列表。

public class Reminder {
    String name;

    String theme;
    ...
}

我做了这样的方法,但它没有用。对于Object类型,方法getTheme()未定义。

public List<Reminder> filterReminderByTheme(String theme) {
    result = elements.values()
            .stream()
            .filter(reminder -> theme.equals(reminder.getValue().getTheme()))
            .collect(Collectors.toList());
    return result;
}

有些想法?

2 个答案:

答案 0 :(得分:0)

  

,密钥是Reminder / Contact:

Java认为他们只是对象......值相同

Map<Object, Object> elements 

我建议您重新定义地图以获得相应的类型,而elements.values()将是右侧的类型,因此如果您希望这些作为值列表,则不应该是关键

Map<String, Reminder> elements

有了这个,过滤器将是

.filter(reminder -> theme.equals(reminder.getTheme()))

答案 1 :(得分:0)

在测试主题之前,您应首先确保该值为Reminder。 您使用的引用是Object引用,即使方法是在基础对象中定义的,您也无法使用Reminder方法。

你首先需要施展它。要投射它,你必须首先确保它确实是instanceof目标类。

public List<Reminder> filterReminderByTheme(String theme) {
    result = elements.values()
            .stream()
            .filter(value -> value instanceof Reminder 
                                   && theme.equals(((Reminder)value).getTheme()))
            .collect(Collectors.toList());
    return result;
}