0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

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

jf_ro2CN3Fa ? 來(lái)源:CSDN ? 2023-08-12 11:15 ? 次閱讀

可以使用Java8的Stream API來(lái)比較兩個(gè)List的差異,并取出不同的對(duì)象。

方式一具體步驟如下:

將兩個(gè)List轉(zhuǎn)換為Stream類型;

調(diào)用Stream的filter方法,將不同的對(duì)象過(guò)濾出來(lái);

將過(guò)濾出的不同的對(duì)象轉(zhuǎn)換為L(zhǎng)ist類型。

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));

上述代碼中,將兩個(gè)List類型的對(duì)象list1和list2轉(zhuǎn)換為Stream類型,并調(diào)用filter方法篩選出不同的對(duì)象。最后通過(guò)collect方法將不同的對(duì)象轉(zhuǎn)換為L(zhǎng)ist類型,并輸出結(jié)果。

方式二具體步驟如下:

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);

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

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

最后在控制臺(tái)輸出集合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());

首先將兩個(gè)List通過(guò)Stream.concat方法合并成一個(gè)新的Stream對(duì)象,并使用Collectors.groupingBy方法來(lái)按照對(duì)象值進(jìn)行分組計(jì)數(shù)。然后通過(guò)過(guò)濾出現(xiàn)次數(shù)為1的對(duì)象,即為兩個(gè)List中不同的對(duì)象。最后用Collectors.toList方法將所有不同的對(duì)象放到一個(gè)新的List中。

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

方式四具體步驟如下:

根據(jù)對(duì)象的屬性進(jìn)行比較兩個(gè)擁有相同對(duì)象List的集合,并取出不同對(duì)象。

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

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());

首先將兩個(gè)List通過(guò)Stream.concat方法合并成一個(gè)新的Stream對(duì)象,并使用Collectors.groupingBy方法來(lái)按照屬性名稱進(jìn)行分組計(jì)數(shù)。然后通過(guò)過(guò)濾出現(xiàn)次數(shù)為1的屬性名稱,即為兩個(gè)List中不同的屬性名稱。最后使用Stream.map方法獲取對(duì)應(yīng)名稱的第一個(gè)ProductAttributeNameDTO對(duì)象,放到一個(gè)新的List中。

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






審核編輯:劉清

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 控制器
    +關(guān)注

    關(guān)注

    112

    文章

    16103

    瀏覽量

    177077
  • JAVA語(yǔ)言
    +關(guān)注

    關(guān)注

    0

    文章

    138

    瀏覽量

    20062
  • 過(guò)濾器
    +關(guān)注

    關(guān)注

    1

    文章

    427

    瀏覽量

    19520

原文標(biāo)題:Java Stream 比較兩個(gè) List 的差異,并取出不同的對(duì)象

文章出處:【微信號(hào):芋道源碼,微信公眾號(hào):芋道源碼】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    Stream API原理介紹

    原理介紹 Stream API 的核心是 Stream 接口,它表示一組元素的序列,可以按需進(jìn)行計(jì)算。Stream 接口提供了大量的中間操作和終端操作,可以用于過(guò)濾、映射、排序、聚合
    的頭像 發(fā)表于 09-30 15:31 ?663次閱讀

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

    TestStand提供了很多比較豐富的工具,其中TestStand File Diff and Merge Utility就是專門(mén)用來(lái)比較兩個(gè)Sequence測(cè)試序列差異的工具,該工具
    發(fā)表于 08-24 21:05

    JAVA學(xué)習(xí)直通車(教程+書(shū)籍+100個(gè)實(shí)例+問(wèn)題與解答)

    對(duì)于Java8的并行流并不陌生,沒(méi)錯(cuò),我們常常用它來(lái)執(zhí)行并行任務(wù),但是由于并行流(parallel stream)采用的是享線程池,可能會(huì)對(duì)我們的性能造成嚴(yán)重影響,那怎么處理?`
    發(fā)表于 10-25 14:35

    請(qǐng)問(wèn)兩個(gè)API的使用是什么?

    你好兩個(gè)API的使用是什么?StRelaMARMASK()RTCHGETALMALMASK()實(shí)際上,我正在嘗試比較當(dāng)前時(shí)間和警報(bào)時(shí)間。如果報(bào)警時(shí)間和當(dāng)前時(shí)間匹配,則會(huì)發(fā)生報(bào)警。如果兩個(gè)
    發(fā)表于 09-18 13:52

    java8新特性

    java8為接口聲明添加非抽象方法的實(shí)現(xiàn),也成為拓展方法。
    發(fā)表于 11-27 15:54 ?1723次閱讀

    Java并行流存在的問(wèn)題及解決辦法詳解

    對(duì)于從事Java開(kāi)發(fā)的童鞋來(lái)說(shuō),相信對(duì)于Java8的并行流并不陌生,沒(méi)錯(cuò),我們常常用它來(lái)執(zhí)行并行任務(wù),但是由于并行流(parallel stream)采用的是享線程池,可能會(huì)對(duì)我們的性能造成嚴(yán)重影響,那怎么處理
    發(fā)表于 04-03 15:55 ?12次下載

    一探究竟Java 8Stream API性能

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

    如何利用Stream API來(lái)優(yōu)化Java代碼

    使用Stream API優(yōu)化代碼 Java8的新特性主要是Lambda表達(dá)式和流,當(dāng)流和Lambda表達(dá)式結(jié)合起來(lái)一起使用時(shí),因?yàn)榱魃昝魇教幚頂?shù)據(jù)集合的特點(diǎn),可以讓代碼變得簡(jiǎn)潔易讀 放大招,流
    的頭像 發(fā)表于 07-26 14:30 ?1270次閱讀

    JAVA8提供了Optional類來(lái)優(yōu)化這種寫(xiě)法

    這種寫(xiě)法是比較丑陋的,為了避免上述丑陋的寫(xiě)法,讓丑陋的設(shè)計(jì)變得優(yōu)雅。JAVA8提供了Optional類來(lái)優(yōu)化這種寫(xiě)法,接下來(lái)的正文部分進(jìn)行詳細(xì)說(shuō)明
    的頭像 發(fā)表于 04-24 15:18 ?1036次閱讀

    Java 8 Stream之collect()的奇技淫巧

    本身我是一個(gè)比較偏向少使用Stream的人,因?yàn)檎{(diào)試比較不方便。但是, 不得不說(shuō),stream確實(shí)會(huì)給我們編碼帶來(lái)便捷。所以還是忍不住想分享
    的頭像 發(fā)表于 11-22 15:49 ?834次閱讀

    Linux中如何比較兩個(gè)文件的差異?

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

    Linux中如何比較兩個(gè)文件的差異?

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

    Java8Stream流 map() 方法

    前言 在日常的開(kāi)發(fā)工作中經(jīng)常碰到要處理 List 中數(shù)據(jù)的問(wèn)題,比如從一個(gè)對(duì)象集合中獲得對(duì)象中的一個(gè)屬性的集合。之前我們想到的是遍歷每個(gè)元素,然后取出來(lái)放到另外一個(gè)集合中,
    的頭像 發(fā)表于 09-25 11:06 ?1733次閱讀
    <b class='flag-5'>Java8</b>的<b class='flag-5'>Stream</b>流 map() 方法

    Java8的新特性

    雖然目前Java最新版本都已經(jīng)到16了,但是絕大部分公司目前用的Java版本都是8,想當(dāng)初Java8問(wèn)世后,其Lambda表達(dá)式與方法引用可是最亮眼的新特性,目前,這
    的頭像 發(fā)表于 10-10 17:12 ?479次閱讀

    JavaStream的常用知識(shí)

    ?我們都知道,傳統(tǒng)的處理中,每一步我們都需要通過(guò)循環(huán)控制,邏輯控制,解包,重新裝箱這些工作。 非生產(chǎn)線示意處理圖 這些步驟讓我們的程序的業(yè)務(wù)邏輯支離破碎,經(jīng)常處理數(shù)據(jù)類的小伙伴尤為痛苦。幸運(yùn)的是,Java8為我們引入了Stream,使用
    的頭像 發(fā)表于 10-11 15:45 ?427次閱讀
    <b class='flag-5'>Java</b>的<b class='flag-5'>Stream</b>的常用知識(shí)