Java?Stream比較兩個(gè)List的差異并取出不同的對(duì)象四種方法
可以使用Java8的Stream API來比較兩個(gè)List的差異,并取出不同的對(duì)象。
方式一具體步驟如下:
1. 將兩個(gè)List轉(zhuǎn)換為Stream類型;
2. 調(diào)用Stream的filter方法,將不同的對(duì)象過濾出來;
3. 將過濾出的不同的對(duì)象轉(zhuǎn)換為List類型。
List<String> list1 = Arrays.asList("A", "B", "C", "D"); List<String> list2 = Arrays.asList("B", "C", "E", "F", "A", "D"); List<String> diff = list1.stream().filter(item -> !list2.contains(item)).collect(Collectors.toList()); List<String> 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ì)象。最后通過collect方法將不同的對(duì)象轉(zhuǎn)換為List類型,并輸出結(jié)果。
方式二具體步驟如下:
List<String> list1 = Arrays.asList("apple", "banana", "orange", "pear"); List<String> list2 = Arrays.asList("apple", "banana", "grape"); List<String> list3 = Stream.concat( list1.stream().filter(str -> !list2.contains(str)), list2.stream().filter(str -> !list1.contains(str))) .collect(Collectors.toList()); System.out.println("Different strings: " + list3);
上述代碼,首先定義了兩個(gè)List<String>類型的變量list1和list2,分別表示要比較的兩個(gè)列表。然后使用Stream的concat()方法將兩個(gè)Stream對(duì)象連接起來,得到一個(gè)由兩個(gè)列表的不同元素組成的Stream。
具體來說,第一個(gè)Stream對(duì)象是list1中與list2不同的元素,使用filter()方法過濾出來;第二個(gè)Stream對(duì)象是list2中與list1不同的元素,同樣也是使用filter()方法過濾出來。最后使用collect(Collectors.toList())將這些不同的元素收集到一個(gè)List中,返回的就是兩個(gè)列表不同的元素組成的集合list3。
最后在控制臺(tái)輸出集合list3,即可得到list1和list2中不同的字符串。
方式三具體步驟如下:
List<Object> l1 = new ArrayList<>(); l1.add(new Object(1, "a")); l1.add(new Object(2, "b")); l1.add(new Object(3, "c")); List<Object> l2 = new ArrayList<>(); l2.add(new Object(1, "a")); l2.add(new Object(3, "c")); l2.add(new Object(4, "d")); List<Object> resultList = 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通過Stream.concat方法合并成一個(gè)新的Stream對(duì)象,并使用Collectors.groupingBy方法來按照對(duì)象值進(jìn)行分組計(jì)數(shù)。然后通過過濾出現(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ì)象。
List<ProductAttributeNameDTO> l1 = Arrays.asList( new ProductAttributeNameDTO(1L, "顏色"), new ProductAttributeNameDTO(2L, "尺碼"), new ProductAttributeNameDTO(3L, "重量") ); List<ProductAttributeNameDTO> l2 = Arrays.asList( new ProductAttributeNameDTO(1L, "顏色"), new ProductAttributeNameDTO(3L, "重量"), new ProductAttributeNameDTO(4L, "材質(zhì)") ); List<ProductAttributeNameDTO> 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通過Stream.concat方法合并成一個(gè)新的Stream對(duì)象,并使用Collectors.groupingBy方法來按照屬性名稱進(jìn)行分組計(jì)數(shù)。然后通過過濾出現(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)行比較。
附:java 取出倆個(gè)list對(duì)象中不同值代碼示例
//取出不同的集合 List<ObituaryInfoVO> userList = obituaryInfoVOS.stream() .filter(obituaryInfoVO -> !digitalAssetVOList.stream() .map(digitalAssetVO -> digitalAssetVO.getObituaryId()) .collect(Collectors.toList()) .contains(obituaryInfoVO.getId())) .collect(Collectors.toList()); //取出相同的集合 List<TeamArea> userList = areaList.stream().collect(Collectors.collectingAndThen( // Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing(TeamArea::getSecondRegion))), // ArrayList::new));
總結(jié)
到此這篇關(guān)于Java Stream比較兩個(gè)List的差異并取出不同的對(duì)象四種方法的文章就介紹到這了,更多相關(guān)Java Stream比較兩個(gè)List并取對(duì)象內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
springboot整合netty-mqtt-client實(shí)現(xiàn)Mqtt消息的訂閱和發(fā)布示例
本文主要介紹了springboot整合netty-mqtt-client實(shí)現(xiàn)Mqtt消息的訂閱和發(fā)布示例,文中根據(jù)實(shí)例編碼詳細(xì)介紹的十分詳盡,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-03-03IDEA生成patch和使用patch的方法實(shí)現(xiàn)
比如你本地修復(fù)的 bug,需要把增量文件發(fā)給客戶,很多場景下大家都需要手工整理修改的文件,并整理好目錄,這個(gè)很麻煩,那有沒有簡單的技巧呢?本文主要介紹了IDEA生成patch和使用patch的方法實(shí)現(xiàn),感興趣的可以了解一下2023-08-08SpringBoot使用RestTemplate如何通過http請(qǐng)求將文件下載到本地
文章介紹了如何通過編寫代碼批量下載文件,解決了沒有提供批量下載接口的問題,首先篩選出需要下載的文件ID,然后通過后端代碼發(fā)起HTTP請(qǐng)求,將下載的資源寫入本地文件中,總結(jié)了實(shí)現(xiàn)方式和注意事項(xiàng),希望能為類似任務(wù)提供參考2025-02-02詳解Java字節(jié)碼編程之非常好用的javassist
這篇文章主要介紹了詳解Java字節(jié)碼編程之非常好用的javassist,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-04-04解決JDBC連接Mysql長時(shí)間無動(dòng)作連接失效的問題
這篇文章主要介紹了解決JDBC連接Mysql長時(shí)間無動(dòng)作連接失效的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2021-03-03