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

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

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
主站蜘蛛池模板: 草草草视频在线观看 | 99re5精品视频在线观看 | 精品久久久久久久久久久久久久久 | 午夜黄视频 | 国产在线播放一区 | 香蕉免费高清完整 | 国士李风起全文在线阅读 | 国产精品va在线观看不 | 超级碰碰免费视频 | 午夜AV国产欧美亚洲高清在线 | 海绵宝宝第二季全集免费观看 | 99影视在线视频免费观看 | 猥琐对着美女飞机喷到脸上 | 日本免费在线观看视频 | 亚洲狼人综合干 | 蜜柚精彩在线观看 | 午夜影院c绿象 | 视频在线观看一区二区 | 亚洲色图15p| caoporen在线视频入口 | www.久久av.com | 日日视频 | 国产传媒在线播放 | 国产日韩欧美 | 亚洲图片二区 | 无码人妻丰满熟妇啪啪网不卡 | 日b视频免费看 | 国产精品一区二区国产 | 亚洲精品国产综合久久一线 | 久久视频这里只精品99热在线观看 | 日本mature乱子视频 | 无毛黄片| 波多野结衣同性系列698 | 国产精品久久久久一区二区三区 | 天天综合天天综合色在线 | 5x社区发源地最新地址 | 男人的天堂在线 | 极品91 | 美女脱小内内给男生摸j | 欧美色图日韩 | 成年男女免费视频网站 |