Java 8 Streams 中的过滤器映射
Posted
技术标签:
【中文标题】Java 8 Streams 中的过滤器映射【英文标题】:filter Map in Java 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 -> s.getKey(), s -> s.getValue())
,它可以转换为方法引用,就像@Eran 的回答一样。我推荐,即使它们有点长
您可能想阅读这个问题以及它被标记为与***.com/questions/1992384/…重复的问题
【参考方案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<Integer,Student>
吗?
@Ankit 您是在问结果是否是 HashMap,还是在问如何确保结果是 HashMap? Collectors.toMap
的 2 参数变体返回 Map
。还有其他变体,您可以在其中指定要创建的地图类型。
@Ankit 你想使用最简单的接口,这是必要的。如果它是一个HashMap(它将是)应该没有关系,但是如果你需要一个特定的实现,比如LinkedHashMap,那么你需要使用4参数toMap ***.com/questions/29090277/…
@Eran:我收到编译错误Type mismatch: cannot convert from Map<Object,Object> to HashMap<Integer,Student>
。现在,铸造后一切正常。谢谢
@Ankit 不要通过 HashMap以上是关于Java 8 Streams 中的过滤器映射的主要内容,如果未能解决你的问题,请参考以下文章
如何使用Java Streams API正确过滤开始日期和结束日期之间的日期?