如何使用Java Streams API筛选List中name属性重复的对象
首先需要给你的POJO类补全属性的getter方法,否则Stream无法读取私有属性值:
public class SomeClass { private int id; private String name; public SomeClass(int id, String name) { super(); this.id = id; this.name = name; } // 补充getter方法 public int getId() { return id; } public String getName() { return name; } }
具体实现代码
我们可以先统计所有name属性的出现频次,再基于频次过滤原列表,这种方式时间复杂度为O(n),执行效率更高:
// 第一步:统计每个name对应的出现次数 Map<String, Long> nameCountMap = list.stream() .collect(Collectors.groupingBy(SomeClass::getName, Collectors.counting())); // 第二步:过滤出name出现次数大于1的对象,得到结果 List<SomeClass> result = list.stream() .filter(obj -> nameCountMap.get(obj.getName()) > 1) .collect(Collectors.toList());
最终输出结果的id序列为1,2,5,2,3,完全匹配你预期的s1、s3、s2、s5、s6的顺序。
内容的提问来源于stack exchange,提问作者Santosh Kamat
相关产品推荐
相关产品推荐

