可以使用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"); List list2=Arrays.asList("B","C","E","F","A","D"); List diff=list1.stream().filter(item->!list2.contains(item)).collect(Collectors.toList()); List diff1=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"); List list2=Arrays.asList("apple","banana","grape"); List list3=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
具體來(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中不同的字符串。
方式三具體步驟如下:
List
首先將兩個(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,"重量") ); List l2=Arrays.asList( newProductAttributeNameDTO(1L,"顏色"), newProductAttributeNameDTO(3L,"重量"), newProductAttributeNameDTO(4L,"材質(zhì)") ); List resultList=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)行比較。
審核編輯:劉清
-
控制器
+關(guān)注
關(guān)注
112文章
16103瀏覽量
177077 -
JAVA語(yǔ)言
+關(guān)注
關(guān)注
0文章
138瀏覽量
20062 -
過(guò)濾器
原文標(biāo)題:Java Stream 比較兩個(gè) List 的差異,并取出不同的對(duì)象
文章出處:【微信號(hào):芋道源碼,微信公眾號(hào):芋道源碼】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論