可以使用Java8的Stream API來比較兩個List的差異,并取出不同的對象。
方式一具體步驟如下:
將兩個List轉換為Stream類型;
調用Stream的filter方法,將不同的對象過濾出來;
將過濾出的不同的對象轉換為List類型。
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));
上述代碼中,將兩個List類型的對象list1和list2轉換為Stream類型,并調用filter方法篩選出不同的對象。最后通過collect方法將不同的對象轉換為List類型,并輸出結果。
方式二具體步驟如下:
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);
上述代碼,首先定義了兩個List
具體來說,第一個Stream對象是list1中與list2不同的元素,使用filter()方法過濾出來;第二個Stream對象是list2中與list1不同的元素,同樣也是使用filter()方法過濾出來。最后使用collect(Collectors.toList())將這些不同的元素收集到一個List中,返回的就是兩個列表不同的元素組成的集合list3。
最后在控制臺輸出集合list3,即可得到list1和list2中不同的字符串。
方式三具體步驟如下:
List
首先將兩個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,"重量") ); List l2=Arrays.asList( newProductAttributeNameDTO(1L,"顏色"), newProductAttributeNameDTO(3L,"重量"), newProductAttributeNameDTO(4L,"材質") ); 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());
首先將兩個List通過Stream.concat方法合并成一個新的Stream對象,并使用Collectors.groupingBy方法來按照屬性名稱進行分組計數。然后通過過濾出現次數為1的屬性名稱,即為兩個List中不同的屬性名稱。最后使用Stream.map方法獲取對應名稱的第一個ProductAttributeNameDTO對象,放到一個新的List中。
需要注意的是,ProductAttributeNameDTO類需要正確實現equals和hashCode方法,以便Stream能夠正確進行對象的比較。同時,此方法適用于List中存放的是ProductAttributeNameDTO類型的對象。如果存放其他類型的對象,則需要根據對象的屬性進行比較或自定義Comparator進行比較。
審核編輯:劉清
-
控制器
+關注
關注
112文章
16198瀏覽量
177399 -
JAVA語言
+關注
關注
0文章
138瀏覽量
20074 -
過濾器
+關注
關注
1文章
427瀏覽量
19557
原文標題:Java Stream 比較兩個 List 的差異,并取出不同的對象
文章出處:【微信號:芋道源碼,微信公眾號:芋道源碼】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論