<acronym id="s8ci2"><small id="s8ci2"></small></acronym>
<rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
<acronym id="s8ci2"></acronym>
<acronym id="s8ci2"><center id="s8ci2"></center></acronym>
0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

怎么使用Java8的Stream API比較兩個List的差異呢?

jf_ro2CN3Fa ? 來源:CSDN ? 2023-08-12 11:15 ? 次閱讀

可以使用Java8的Stream API來比較兩個List的差異,并取出不同的對象。

方式一具體步驟如下:

將兩個List轉換為Stream類型;

調用Stream的filter方法,將不同的對象過濾出來;

將過濾出的不同的對象轉換為List類型。

Listlist1=Arrays.asList("A","B","C","D");
Listlist2=Arrays.asList("B","C","E","F","A","D");
Listdiff=list1.stream().filter(item->!list2.contains(item)).collect(Collectors.toList());
Listdiff1=list2.stream().filter(item->!list1.contains(item)).collect(Collectors.toList());
diff.addAll(diff1);

diff.forEach(x->System.out.println(x));

上述代碼中,將兩個List類型的對象list1和list2轉換為Stream類型,并調用filter方法篩選出不同的對象。最后通過collect方法將不同的對象轉換為List類型,并輸出結果。

方式二具體步驟如下:

Listlist1=Arrays.asList("apple","banana","orange","pear");
Listlist2=Arrays.asList("apple","banana","grape");

Listlist3=Stream.concat(
list1.stream().filter(str->!list2.contains(str)),
list2.stream().filter(str->!list1.contains(str)))
.collect(Collectors.toList());

System.out.println("Differentstrings:"+list3);

上述代碼,首先定義了兩個List類型的變量list1和list2,分別表示要比較的兩個列表。然后使用Stream的concat()方法將兩個Stream對象連接起來,得到一個由兩個列表的不同元素組成的Stream。

具體來說,第一個Stream對象是list1中與list2不同的元素,使用filter()方法過濾出來;第二個Stream對象是list2中與list1不同的元素,同樣也是使用filter()方法過濾出來。最后使用collect(Collectors.toList())將這些不同的元素收集到一個List中,返回的就是兩個列表不同的元素組成的集合list3。

最后在控制臺輸出集合list3,即可得到list1和list2中不同的字符串。

方式三具體步驟如下:

Listl1=newArrayList<>();
l1.add(newObject(1,"a"));
l1.add(newObject(2,"b"));
l1.add(newObject(3,"c"));

Listl2=newArrayList<>();
l2.add(newObject(1,"a"));
l2.add(newObject(3,"c"));
l2.add(newObject(4,"d"));

ListresultList=Stream.concat(l1.stream(),l2.stream())
.collect(Collectors.groupingBy(Function.identity(),Collectors.counting()))
.entrySet().stream()
.filter(e->e.getValue()==1)
.map(Map.Entry::getKey)
.collect(Collectors.toList());

首先將兩個List通過Stream.concat方法合并成一個新的Stream對象,并使用Collectors.groupingBy方法來按照對象值進行分組計數。然后通過過濾出現次數為1的對象,即為兩個List中不同的對象。最后用Collectors.toList方法將所有不同的對象放到一個新的List中。

需要注意的是,Object類需要正確實現equals和hashCode方法,以便Stream能夠正確進行對象的比較。同時,此方法適用于List中存放的對象是Java內置類型或者自定義類型,但不適用于包含數組、Map等集合類型的情況。

方式四具體步驟如下:

根據對象的屬性進行比較兩個擁有相同對象List的集合,并取出不同對象。

Listl1=Arrays.asList(
newProductAttributeNameDTO(1L,"顏色"),
newProductAttributeNameDTO(2L,"尺碼"),
newProductAttributeNameDTO(3L,"重量")
);
Listl2=Arrays.asList(
newProductAttributeNameDTO(1L,"顏色"),
newProductAttributeNameDTO(3L,"重量"),
newProductAttributeNameDTO(4L,"材質")
);

ListresultList=Stream.concat(l1.stream(),l2.stream())
.collect(Collectors.groupingBy(ProductAttributeNameDTO::getName,Collectors.counting()))
.entrySet().stream()
.filter(e->e.getValue()==1)
.map(e->e.getKey())
.map(name->Stream.concat(l1.stream(),l2.stream()).filter(p->p.getName().equals(name)).findFirst().get())
.collect(Collectors.toList());

首先將兩個List通過Stream.concat方法合并成一個新的Stream對象,并使用Collectors.groupingBy方法來按照屬性名稱進行分組計數。然后通過過濾出現次數為1的屬性名稱,即為兩個List中不同的屬性名稱。最后使用Stream.map方法獲取對應名稱的第一個ProductAttributeNameDTO對象,放到一個新的List中。

需要注意的是,ProductAttributeNameDTO類需要正確實現equals和hashCode方法,以便Stream能夠正確進行對象的比較。同時,此方法適用于List中存放的是ProductAttributeNameDTO類型的對象。如果存放其他類型的對象,則需要根據對象的屬性進行比較或自定義Comparator進行比較。






審核編輯:劉清

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 控制器
    +關注

    關注

    112

    文章

    15298

    瀏覽量

    171941
  • JAVA語言
    +關注

    關注

    0

    文章

    138

    瀏覽量

    19956
  • 過濾器
    +關注

    關注

    1

    文章

    411

    瀏覽量

    19112

原文標題:Java Stream 比較兩個 List 的差異,并取出不同的對象

文章出處:【微信號:芋道源碼,微信公眾號:芋道源碼】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    Stream API原理介紹

    Stream APIJava 8 中最重要的新特性之一,它是處理集合和數組的一種新方式。它提供了一種簡單、靈活和可讀的方式來處理集合和數組中的元素,從而使代碼更加簡潔、高效和易于維護。 1.
    的頭像 發表于 09-30 15:31 ?389次閱讀

    TestStand中如何快速比較兩個類似的Sequence之間的差異

    TestStand提供了很多比較豐富的工具,其中TestStand File Diff and Merge Utility就是專門用來比較兩個Sequence測試序列差異的工具,該工具
    發表于 08-24 21:05

    JAVA學習直通車(教程+書籍+100實例+問題與解答)

    對于Java8的并行流并不陌生,沒錯,我們常常用它來執行并行任務,但是由于并行流(parallel stream)采用的是享線程池,可能會對我們的性能造成嚴重影響,那怎么處理?`
    發表于 10-25 14:35

    請問兩個API的使用是什么?

    你好兩個API的使用是什么?StRelaMARMASK()RTCHGETALMALMASK()實際上,我正在嘗試比較當前時間和警報時間。如果報警時間和當前時間匹配,則會發生報警。如果兩個
    發表于 09-18 13:52

    api中如何掛載兩個分區

    想使用dfs掛載elm文件系統,flash已經分好了兩個區,但是在api中沒有看到如何掛載兩個分區,現在只能掛載一分區。
    發表于 09-15 14:25

    java8新特性

    java8為接口聲明添加非抽象方法的實現,也成為拓展方法。
    發表于 11-27 15:54 ?1630次閱讀

    一探究竟Java 8的Stream API性能

    已經對 Stream API 的用法鼓吹夠多了,用起簡潔直觀,但性能到底怎么樣呢?會不會有很高的性能損失?
    的頭像 發表于 05-04 14:20 ?1540次閱讀
    一探究竟<b class='flag-5'>Java</b> 8的<b class='flag-5'>Stream</b> <b class='flag-5'>API</b>性能

    如何利用Stream API來優化Java代碼

    使用Stream API優化代碼 Java8的新特性主要是Lambda表達式和流,當流和Lambda表達式結合起來一起使用時,因為流申明式處理數據集合的特點,可以讓代碼變得簡潔易讀 放大
    的頭像 發表于 07-26 14:30 ?1157次閱讀

    JAVA8提供了Optional類來優化這種寫法

    這種寫法是比較丑陋的,為了避免上述丑陋的寫法,讓丑陋的設計變得優雅。JAVA8提供了Optional類來優化這種寫法,接下來的正文部分進行詳細說明
    的頭像 發表于 04-24 15:18 ?872次閱讀

    Linux中如何比較兩個文件的差異?

    Linux 中如何比較兩個文件的差異?答案是使用 diff 命令。
    的頭像 發表于 01-17 17:30 ?4701次閱讀
    Linux中如何<b class='flag-5'>比較</b><b class='flag-5'>兩個</b>文件的<b class='flag-5'>差異</b>?

    Linux中如何比較兩個文件的差異?

    Linux 中如何比較兩個文件的差異?答案是使用 diff 命令。
    的頭像 發表于 01-30 16:04 ?1.1w次閱讀
    Linux中如何<b class='flag-5'>比較</b><b class='flag-5'>兩個</b>文件的<b class='flag-5'>差異</b>?

    list.sort()排序比stream().sorted()排序性能更好嗎?

    看到一個評論,里面提到了list.sort()和list.strem().sorted()排序的差異。
    的頭像 發表于 08-09 10:27 ?605次閱讀
    <b class='flag-5'>list</b>.sort()排序比<b class='flag-5'>stream</b>().sorted()排序性能更好嗎?

    Java8Stream流 map() 方法

    前言 在日常的開發工作中經常碰到要處理 List 中數據的問題,比如從一個對象集合中獲得對象中的一個屬性的集合。之前我們想到的是遍歷每個元素,然后取出來放到另外一個集合中,比較繁瑣;在 Java8
    的頭像 發表于 09-25 11:06 ?751次閱讀
    <b class='flag-5'>Java8</b>的<b class='flag-5'>Stream</b>流 map() 方法

    Java8的新特性

    雖然目前Java最新版本都已經到16了,但是絕大部分公司目前用的Java版本都是8,想當初Java8問世后,其Lambda表達式與方法引用可是最亮眼的新特性,目前,這兩個特性也被大家廣
    的頭像 發表于 10-10 17:12 ?323次閱讀

    JavaStream的常用知識

    ?我們都知道,傳統的處理中,每一步我們都需要通過循環控制,邏輯控制,解包,重新裝箱這些工作。 非生產線示意處理圖 這些步驟讓我們的程序的業務邏輯支離破碎,經常處理數據類的小伙伴尤為痛苦。幸運的是,Java8為我們引入了Stream,使用
    的頭像 發表于 10-11 15:45 ?275次閱讀
    <b class='flag-5'>Java</b>的<b class='flag-5'>Stream</b>的常用知識
    亚洲欧美日韩精品久久_久久精品AⅤ无码中文_日本中文字幕有码在线播放_亚洲视频高清不卡在线观看
    <acronym id="s8ci2"><small id="s8ci2"></small></acronym>
    <rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
    <acronym id="s8ci2"></acronym>
    <acronym id="s8ci2"><center id="s8ci2"></center></acronym>