一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - java8如何用Stream查List對象某屬性是否有重復

java8如何用Stream查List對象某屬性是否有重復

2021-12-28 00:57流水曉風1 Java教程

這篇文章主要介紹了java8如何用Stream查List對象某屬性是否有重復的操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

使用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

延伸 · 閱讀

精彩推薦
  • Java教程升級IDEA后Lombok不能使用的解決方法

    升級IDEA后Lombok不能使用的解決方法

    最近看到提示IDEA提示升級,尋思已經有好久沒有升過級了。升級完畢重啟之后,突然發現好多錯誤,本文就來介紹一下如何解決,感興趣的可以了解一下...

    程序猿DD9332021-10-08
  • Java教程Java使用SAX解析xml的示例

    Java使用SAX解析xml的示例

    這篇文章主要介紹了Java使用SAX解析xml的示例,幫助大家更好的理解和學習使用Java,感興趣的朋友可以了解下...

    大行者10067412021-08-30
  • Java教程20個非常實用的Java程序代碼片段

    20個非常實用的Java程序代碼片段

    這篇文章主要為大家分享了20個非常實用的Java程序片段,對java開發項目有所幫助,感興趣的小伙伴們可以參考一下 ...

    lijiao5352020-04-06
  • Java教程Java8中Stream使用的一個注意事項

    Java8中Stream使用的一個注意事項

    最近在工作中發現了對于集合操作轉換的神器,java8新特性 stream,但在使用中遇到了一個非常重要的注意點,所以這篇文章主要給大家介紹了關于Java8中S...

    阿杜7482021-02-04
  • Java教程xml與Java對象的轉換詳解

    xml與Java對象的轉換詳解

    這篇文章主要介紹了xml與Java對象的轉換詳解的相關資料,需要的朋友可以參考下...

    Java教程網2942020-09-17
  • Java教程小米推送Java代碼

    小米推送Java代碼

    今天小編就為大家分享一篇關于小米推送Java代碼,小編覺得內容挺不錯的,現在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧...

    富貴穩中求8032021-07-12
  • Java教程Java實現搶紅包功能

    Java實現搶紅包功能

    這篇文章主要為大家詳細介紹了Java實現搶紅包功能,采用多線程模擬多人同時搶紅包,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙...

    littleschemer13532021-05-16
  • Java教程Java BufferWriter寫文件寫不進去或缺失數據的解決

    Java BufferWriter寫文件寫不進去或缺失數據的解決

    這篇文章主要介紹了Java BufferWriter寫文件寫不進去或缺失數據的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望...

    spcoder14552021-10-18
主站蜘蛛池模板: 国产精品久久久久久久久ktv | 无码11久岁箩筣 | 婚色阿花在线全文免费笔 | 精品在线视频一区 | 亚洲乱码一区二区三区国产精品 | 2020年新四虎免费 | 成人免费视屏 | 91热爆 | 亚洲是图你懂的 | 欧美专区亚洲 | jiuse在线 | 日韩欧美国产成人 | 日韩精品福利视频一区二区三区 | 国产成人影院一区二区 | 精品在线免费观看视频 | 女同学高中你下面好紧 | 和岳m的小说 | 高清在线观看免费 | 日本高清中文字幕视频在线 | 秋霞网毛片 | gay男男白袜chinese | 日本天堂影院在线播放 | 精品久久久久久久久久久久久久久 | 不知火舞被c视频在线播放 不卡一区二区三区卡 | 91免费永久在线地址 | 青青草99久久精品国产综合 | 3x免费高清视频 | 深夜福利在线播放 | 久久国产精品免费网站 | free白嫩性hd| 免费369看片入口 | 成年人在线视频免费观看 | 丝瓜草莓香蕉绿巨人幸福宝 | 日韩欧美一区二区三区 | 亚洲视频免费在线看 | 国产福利在线观看第二区 | 日韩高清在线免费观看 | 亚洲 欧美 国产 综合 在线 | 国产亚洲精品激情一区二区三区 | 91精品国产色综合久久不卡蜜 | 成人精品一区二区三区 |