使用Stream查List对象某属性是否有重复
Java8开发中,针对List对象集合,常需要判断某个属性是否存在重复值。用Stream流处理能方便的得到结果。
练习一下stream的一些用法
测试示例Java代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
|
@Test public void t2() { List<User> list = new ArrayList<>(); User user1 = new User( "zhangsan" , "beijing" , 30 ); User user2 = new User( "zhangsan" , "beijing" , 40 ); User user3 = new User( "lisi" , "shanghai" , 35 ); User user4 = new User( "lisi" , "shanghai" , 28 ); User user5 = new User( "lisim" , "shanghai" , 32 ); list.add(user1); list.add(user2);list.add(user3); list.add(user4);list.add(user5); System.out.println( "原始数据:" +list); //判断姓名是否有重复,练习使用java8的stream方法 //方法1. distinct, 直接比较大小,只知道是否有重复 List<String> collect1 = list.stream().map(User::getName).distinct().collect(Collectors.toList()); System.out.println(collect1.size()!=list.size()? "方法1-姓名有重复" : "无重复" ); //方法2.用户姓名计数 Map<Object, Long> collect2 = list.stream().collect( Collectors.groupingBy( User::getName , Collectors.counting() ) ); System.out.println( "姓名重复计数情况:" +collect2); //筛出有重复的姓名 List<Object> collect3 = collect2.keySet().stream(). filter(key -> collect2.get(key) > 1 ).collect(Collectors.toList()); //可以知道有哪些姓名有重复 System.out.println( "方法2-重复的姓名 : " +collect3); //方法3,对重复的姓名保留计数 List<Map<String, Long>> collect4 = collect2.keySet().stream(). filter(key -> collect2.get(key) > 1 ).map(key -> { Map<String, Long> map = new HashMap<>(); map.put((String) key, collect2.get(key)); return map; }).collect(Collectors.toList()); System.out.println( "方法3-重复的姓名及计数:" +collect4); } |
运行结果,方便验证是否是需要的样子。
原始数据:[User(name=zhangsan, address=beijing, age=30), User(name=zhangsan, address=beijing, age=40), User(name=lisi, address=shanghai, age=35), User(name=lisi, address=shanghai, age=28), User(name=lisim, address=shanghai, age=32)]
方法1-姓名有重复
姓名重复计数情况:{lisi=2, zhangsan=2, lisim=1}
方法2-重复的姓名 : [lisi, zhangsan]
方法3-重复的姓名及计数:[{lisi=2}, {zhangsan=2}]
list的五种去重方式
面试中经常被问到的list如何去重,一般是口述,不需要代码体现,这个时候,思维一定要清晰,可以罗列出集中去重的方法,以展现你对list数据结构,以及相关方法的掌握,体现你的java基础学的是否牢固
下面,我就将五种方法逐一展现
新建一个list数组:
1
2
3
4
5
6
7
8
9
10
11
|
List list = new ArrayList(); list.add( 26 ); list.add( 39 ); list.add( 39 ); list.add( 39 ); list.add( 39 ); list.add( 5 ); list.add( 40 ); list.add( 39 ); list.add( 25 ); System.out.println(list); |
方法一:使用java8新特性stream进行List去重
1
2
3
|
List newList = list.stream().distinct().collect(Collectors.toList()); System.out.println(“java8新特性stream去重:”+newList); list.add( 39 ); |
方法二:双重for循环去重
1
2
3
4
5
6
7
|
for ( int i = 0 ; i < list.size(); i++) { for ( int j = 0 ; j < list.size(); j++) { if (i!=j&&list.get(i)==list.get(j)) { list.remove(list.get(j)); } } } |
上面的方法研究后,确实有点小问题,下面放上优化后的方法(不推荐使用,速度太慢)
1
2
3
4
5
6
7
8
9
10
11
12
13
|
for ( int i = 0 ; i < list.size(); i++) { for ( int j = 0 ; j < list.size(); ) { // System.out.println(i+"-"+list.get(i)+"-"+j+"!!!!"+list.get(j)); if (i != j && list.get(i) == list.get(j)) { // System.out.println(j+":"+list.get(j)); list.remove(j); } else { j++; } } } System.out.println(“双重 for 循环去重:”+list); list.add( 39 ); |
方法三:set集合判断去重,不打乱顺序
1
2
3
4
5
6
7
8
9
|
Set set1 = new HashSet(); List newList1 = new ArrayList(); for (Integer integer : list) { if (set1.add(integer)) { newList1.add(integer); } } System.out.println(“set集合判断去重:”+list); list.add( 39 ); |
方法四:遍历后判断赋给另一个list集合
1
2
3
4
5
6
7
8
|
List newList2 = new ArrayList(); for (Integer integer : list) { if (!newList2.contains(integer)){ newList2.add(integer); } } System.out.println(“赋值新list去重:”+newList2); list.add( 39 ); |
方法五:set和list转换去重
1
2
3
4
5
|
Set set2 = new HashSet(); List newList3 = new ArrayList(); set2.addAll(list); newList3.addAll(set2); System.out.println(“set和list转换去重:”+newList3); |
以上为个人经验,希望能给大家一个参考,也希望大家多多支持服务器之家。
原文链接:https://blog.csdn.net/lx12345_/article/details/113204658