【问题标题】:Filter a Map by values in Java?在Java中按值过滤地图?
【发布时间】:2018-05-12 15:45:40
【问题描述】:

我有一张地图,其中值为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;
    ...
}

我做了一个这样的方法,但它不起作用。方法 getTheme() 未为 Object 类型定义。

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

有什么想法吗?

【问题讨论】:

    标签: java object filter hashmap java-stream


    【解决方案1】:

    在测试它的主题之前,您应该首先确保该值为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;
    }
    

    【讨论】:

      【解决方案2】:

      关键是提醒/联系方式:

      Java 认为它们只是对象......值也一样

      Map<Object, Object> elements 
      

      我建议您重新定义地图以具有适当的类型,elements.values() 将是右侧的类型,因此如果您希望将它们作为值列表,它不应该是键

      Map<String, Reminder> elements
      

      这样,过滤器将是

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

      【讨论】:

      • 我相信 OP 使用 Map&lt;Object, Object&gt; 的原因是因为值可以是 GregorianCalendar 或 String 并且键可以是 Reminder 或 Contact 根据描述。也许创建一个包装类会更好?
      • 没错。我知道使用 Map 元素会起作用。但我必须用那种方式。
      猜你喜欢
      • 2018-03-18
      • 1970-01-01
      • 1970-01-01
      • 2018-08-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多