【问题标题】:filter Map in Java 8 StreamsJava 8 Streams 中的过滤器映射
【发布时间】:2018-01-01 20:53:02
【问题描述】:

我试图使用 Streams API 过滤 HashMap 中的条目,但停留在最后一个方法调用 Collectors.toMap。所以,我不知道实现 toMap 方法

    public void filterStudents(Map<Integer, Student> studentsMap){
            HashMap<Integer, Student> filteredStudentsMap = studentsMap.entrySet().stream().
            filter(s -> s.getValue().getAddress().equalsIgnoreCase("delhi")).
            collect(Collectors.toMap(k , v));
    }

public class Student {

        private int id;

        private String firstName;

        private String lastName;

        private String address;
    ...

    }

有什么建议吗?

【问题讨论】:

  • 这样你就清楚了。 Collectors.toMap 中的每个参数都有一个函数,因此 k 和 v 不存在。它将是toMap(s -&gt; s.getKey(), s -&gt; s.getValue()),它可以转换为方法引用,就像@Eran 的回答一样。我推荐,即使它们有点长
  • 您可能想阅读这个问题以及它被标记为与stackoverflow.com/questions/1992384/…重复的问题

标签: java java-8 hashmap java-stream


【解决方案1】:

只需从通过过滤器的条目的键和值生成输出Map

public void filterStudents(Map<Integer, Student> studentsMap){
    Map<Integer, Student> filteredStudentsMap = 
        studentsMap.entrySet()
                   .stream()
                   .filter(s -> s.getValue().getAddress().equalsIgnoreCase("delhi"))
                   .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));
}

【讨论】:

  • 我需要将结果映射转换为HashMap&lt;Integer,Student&gt;吗?
  • @Ankit 您是在问结果是否是 HashMap,还是在问如何确保结果是 HashMap? Collectors.toMap 的 2 参数变体返回 Map。还有其他变体,您可以在其中指定要创建的地图类型。
  • @Ankit 你想使用最简单的接口,这是必要的。如果它是一个HashMap(它将是)应该没有关系,但是如果你需要一个特定的实现,比如LinkedHashMap,那么你需要使用4参数toMap stackoverflow.com/questions/29090277/…
  • @Eran:我收到编译错误Type mismatch: cannot convert from Map&lt;Object,Object&gt; to HashMap&lt;Integer,Student&gt;。现在,铸造后一切正常。谢谢
  • @Ankit 不要通过 HashMap 获取结果,而是通过 Map 获取结果。那么你就不需要任何演员表了。
猜你喜欢
  • 2019-01-08
  • 1970-01-01
  • 2021-10-12
  • 2018-12-22
  • 2016-07-22
  • 2021-09-02
  • 2019-01-19
  • 2023-03-21
  • 1970-01-01
相关资源
最近更新 更多