当前位置: 首页 > news >正文

java8提取list中对象有相同属性值的对象或属性值

准备数据

// 原始列表
List<Person> persons = Arrays.asList(new Person("li", 34, "135555"), new Person("jiang", 33, "1366666"), new Person("yang", 22, "135555"), new Person("huang", 32, "1366666"), new Person("han", 31, "1376666")); 
    @Datapublic static class Person {private String name;private int age;private String phoneNumber;public Person(String name, int age, String phoneNumber) {this.name = name;this.age = age;this.phoneNumber = phoneNumber;}}

方式一、使用Collectors.groupingBy按属性分组后筛选计数大于1的条目

根据单个属性提取重复对象

List<Person> list =persons.stream()
.collect(Collectors.groupingBy(Person::getPhoneNumber,Collectors.toList())).values().stream().filter(group -> group.size() > 1).flatMap(List::stream).collect(Collectors.toList());System.out.println(JSON.toJSONString(list));

根据多个属性提取重复对象

通过自定义组合键实现多属性去重:

List<Person> duplicates = persons.stream().collect(Collectors.groupingBy(p -> Arrays.asList(p.getName(), p.getAge()),Collectors.toList())).values().stream().filter(group -> group.size() > 1).flatMap(List::stream).collect(Collectors.toList());

转为map

这会返回属性值(如phoneNumber)与对应对象列表的Map,其中value.size()>1表示该属性值重复

Map<String, List<Person>> map = persons.stream().collect(Collectors.groupingBy(Person::getPhoneNumber)).entrySet().stream().filter(entry -> entry.getValue().size() > 1).collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));System.out.println(JSON.toJSONString(map));

提取重复属性值:转为字符串"1,2,3,4"的形式

String duplicates =persons.stream().collect(Collectors.groupingBy(Person::getPhoneNumber, Collectors.toList())).entrySet().stream().filter(en -> en.getValue().size() > 1).map(Map.Entry::getKey).collect(Collectors.joining(","));System.out.println(duplicates);

方式二、使用toMap计数过滤。

结合Collectors.toMap统计出现次数:

直接返回重复的属性值列表

List<String> duplicateValues = persons.stream().collect(Collectors.toMap(Person::getPhoneNumber,e -> 1,Integer::sum)).entrySet().stream().filter(entry -> entry.getValue() > 1).map(Map.Entry::getKey).collect(Collectors.toList());System.out.println(duplicateValues);

提取重复属性值:转为字符串"1,2,3,4"的形式

String dupNumbers = persons.stream().collect(Collectors.toMap(Person::getPhoneNumber,e -> 1,Integer::sum)).entrySet().stream().filter(entry -> entry.getValue() > 1).map(Map.Entry::getKey).collect(Collectors.joining(","));

方式三、根据特定属性去重。

若需基于属性去重而非提取重复值,可用:

通过TreeSet按phoneNumber去重

List<Person> distinct = persons.stream().collect(Collectors.collectingAndThen(Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing(Person::getPhoneNumber))),ArrayList::new));System.out.println(distinct);

完整代码示例:

public static void main(String[] args) {// 原始列表List<Person> persons = Arrays.asList(new Person("li", 34, "135555"), new Person("jiang", 33, "1366666"), new Person("yang", 22, "135555"), new Person("huang", 32, "1366666"), new Person("han", 31, "1376666")); //方式一、使用Collectors.groupingBy按属性分组后筛选计数大于1的条目List<Person> list =persons.stream()
.collect(Collectors.groupingBy(Person::getPhoneNumber,Collectors.toList())).values().stream().filter(group -> group.size() > 1).flatMap(List::stream).collect(Collectors.toList());System.out.println(JSON.toJSONString(list));//转为map,这会返回属性值(如phoneNumber)与对应对象列表的Map,其中value.size()>1表示该属性值重复Map<String, List<Person>> map = persons.stream().collect(Collectors.groupingBy(Person::getPhoneNumber)).entrySet().stream().filter(entry -> entry.getValue().size() > 1).collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));System.out.println(JSON.toJSONString(map));//提取重复属性值String duplicates =persons.stream().collect(Collectors.groupingBy(Person::getPhoneNumber, Collectors.toList())).entrySet().stream().filter(en -> en.getValue().size() > 1).map(Map.Entry::getKey).collect(Collectors.joining(","));System.out.println(duplicates);//方式二、使用toMap计数过滤。结合Collectors.toMap统计出现次数://直接返回重复的属性值列表List<String> duplicateValues = persons.stream().collect(Collectors.toMap(Person::getPhoneNumber,e -> 1,Integer::sum)).entrySet().stream().filter(entry -> entry.getValue() > 1).map(Map.Entry::getKey).collect(Collectors.toList());System.out.println(duplicateValues);//转为字符串形式:"1,2,3,4"的形式String dupNumbers = persons.stream().collect(Collectors.toMap(Person::getPhoneNumber,e -> 1,Integer::sum)).entrySet().stream().filter(entry -> entry.getValue() > 1).map(Map.Entry::getKey).collect(Collectors.joining(","));//根据特定属性去重。若需基于属性去重而非提取重复值,可用://通过TreeSet按phoneNumber去重List<Person> distinct = persons.stream().collect(Collectors.collectingAndThen(Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing(Person::getPhoneNumber))),ArrayList::new));System.out.println(distinct);@Datapublic static class Person {private String name;private int age;private String phoneNumber;public Person(String name, int age, String phoneNumber) {this.name = name;this.age = age;this.phoneNumber = phoneNumber;}}}

注意事项

  1. 对象需正确实现equals()hashCode()方法,否则分组可能失效5;
  2. 并行流处理时需注意线程安全问题9;
  3. 复杂对象建议使用Comparator.comparing()指定比较逻辑。
http://www.dtcms.com/a/461476.html

相关文章:

  • cuda编程笔记(26)-- 核函数使用任务队列
  • 存储芯片核心产业链研发实力:兆易创新、北京君正、澜起科技、江波龙、长电科技、佰维存储,6家龙头公司研发实力深度数据
  • 《Seq2Time: Sequential Knowledge Transfer for Video LLMTemporal Grounding》
  • 山东省建设部网站官网网站备案审核通过后
  • 浏览器兼容性问题处理
  • Day 09(下) B2a实例解说----exampleB2a.cc+ActionInitialization+PrimaryGeneratorAction
  • 分布式锁:Redisson的可重入锁
  • 计算机硬件相关(AI回答)
  • 网站设计中的用户体验大型网站需要什么样的团队
  • 淘宝网站开发方式网站托管 济南
  • 重庆网站seo案例网站推广用什么方法最好
  • sql报错:java.sql.SQLSyntaxErrorException: Unknown column ‘as0‘ in ‘where clause‘
  • 做网站是什么公司做陶瓷公司网站
  • CentOS 7上安装SonarQube8.9
  • 遗留系统微服务改造(二):数据迁移实战攻略与一致性保证
  • IO操作(Num22)
  • 领码方案|微服务与SOA的世纪对话(6):组织跃迁——智能架构下的团队与文化变革
  • 怎么什么软件可以吧做网站网站被百度收录很重要
  • C++ 单例模式(Singleton)详解
  • 面向未来的数据平台
  • C++5d
  • Transformer实战(21)——文本表示(Text Representation)
  • 网站空间商 权限梵克雅宝
  • 【Vue 3 】——setup、ref、watch
  • 做期货网站违法的吗淄博市住房和城乡建设局网站
  • 使用feign进行远程调用出现的问题(文件服务参数接收为null)
  • 国自然·医工交叉热点|通用医学影像分割基础模型与数据库
  • React Native:关于react自定义css属性的位置
  • 对于el-table中自定义表头中添加el-popover会弹出两个的解决方案,分别针对固定列和非固定列来隐藏最后一个浮框。
  • 电子商务公司简介系统清理优化工具