(资料图)
创建一个user集合
User user1 = new User("user1", 18, "AAA"); User user2 = new User("user2", 18, "BBB"); User user3 = new User("user3", 18, "AAA"); User user4 = new User("user4", 75, "CCC"); User user5 = new User("user5", 35, "AAA"); ArrayList list = new ArrayList<>(); list.add(user1); list.add(user2); list.add(user3); list.add(user4); list.add(user5);
自定义Predict函数,使用filter()写一个Predictpublic class DistinctKeyUtil { public static Predicate distinctByKey(Function super T, ?> keyExtractor) { ConcurrentHashMap
使用filter方法/*** 写一个Predict进行属性过滤*///先过滤age在过滤hobbyList result = list.stream().filter(DistinctKeyUtil.distinctByKey(n -> n.getAge())).filter(DistinctKeyUtil.distinctByKey(n -> n.getHobby())).collect(Collectors.toList());result.forEach(System.out::println);
结果:User{name="user1", age=18, hobby="AAA"}User{name="user4", age=75, hobby="CCC"}
小结:实质上是将每个元素都放到distinctByKey()中的ConcurrentHashMap作为key进行过滤,如果key不存在那么就加上去,如果已经存在了就不加。所以这种方式的过滤只保留第一个重复元素。
利用TreeSet//过滤age ArrayList result2 = list.stream().collect( Collectors.collectingAndThen( Collectors.toCollection( () -> new TreeSet<>(Comparator.comparing(o -> o.getAge()))), ArrayList::new)); result2.forEach(System.out::println);
结果与上面的一样
同时过滤两个属性//age和hobby一起过滤 ArrayList result1 = list.stream().collect( Collectors.collectingAndThen( Collectors.toCollection( () -> new TreeSet<>(Comparator.comparing(o -> o.getHobby() + ";" + o.getAge()))), ArrayList::new) ); result1.forEach(System.out::println);
结果:User{name="user1", age=18, hobby="AAA"}User{name="user5", age=35, hobby="AAA"}User{name="user2", age=18, hobby="BBB"}User{name="user4", age=75, hobby="CCC"}
小结:TreeSet存储唯一的元素,并且按升序对元素进行排序。
Map:保证Key的唯一性/** * map 根据某属性过滤 */ // Function.identity() 相等于 o->o Map map1 = list.stream().collect(Collectors.toMap(User::getHobby, Function.identity(), (t1, t2) -> t1)); Set> entries1 = map1.entrySet(); entries1.forEach(System.out::println);
结果:AAA=User{name="user1", age=18, hobby="AAA"}CCC=User{name="user4", age=75, hobby="CCC"}BBB=User{name="user2", age=18, hobby="BBB"}
小结:map可以选择保留重复属性中的前一条数据还是后一条:(t1, t2) -> t1)
上一篇:人民论坛网评|激发文旅市场新动能
下一篇:最后一页
近日,导演徐克又有了新的大作。他将要拍摄电影《射雕英雄传》,《射雕》这部电视剧,大部分都见过,而且是
也不能算争番失败,他们合作的项目原本是找的张译,杨幂直接愿意让后面去,后来张译推掉了,于是片方找了秦
欢迎观看本篇文章,小升来为大家解答以上问题。火星着陆第一个国家,火星是什么行星呢很多人还不知道,现在
1、非常好。2、上海千林木业有限公司的前身上海莘东锯办厂系由盛永清先生于1984年创立,发展至今已经是由单
出品|子弹财经作者|段楠楠编辑|蛋总美编|倩倩审核|颂文对于消费电子企业来说,2022年无疑十分残酷。面对下
X 关闭
X 关闭
四川广安市48小时内将新改建一个800张床位的方舱医院 记者从今日(19日)中午召开的广安市疫情防控发布会上获悉,广安市应急指挥部决[+更多]
河南:6月底前实现“场所码”全覆盖 “场所码”是流调的关键,是落实常态化疫情防控的重要举措。记者从河南省新冠肺炎疫情防控指挥[+更多]
中新网上海5月19日电 (陈静 朱虹 丁国莲)记者19日获悉,中国学者的最新研究解释,证实了糖尿病的卵母细胞起源,揭示了糖尿病代际遗[+更多]
中新社合肥5月19日电 题:虚拟人走红“Z世代”:未来虚拟人懂情感有温度 中新社记者 张俊 俏皮可爱的虚拟人形象、顺畅自然的肢[+更多]