最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java?Stream比較兩個List的差異并取出不同的對象四種方法

 更新時間:2024年01月30日 09:55:26   作者:Ascend1797  
今天開發(fā)一個需求時要對A和B兩個List集合遍歷,并比較出集合A有,而集合B沒有的值,下面這篇文章主要給大家介紹了關于Java?Stream比較兩個List的差異并取出不同對象的四種方法,需要的朋友可以參考下

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

方式一具體步驟如下:

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

  2. 調(diào)用Stream的filter方法,將不同的對象過濾出來;

  3. 將過濾出的不同的對象轉(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));

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

方式二具體步驟如下: 

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

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

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

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

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

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

方式四具體步驟如下: 

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

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

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

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

附:java 取出倆個list對象中不同值代碼示例

//取出不同的集合
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));

總結

到此這篇關于Java Stream比較兩個List的差異并取出不同的對象四種方法的文章就介紹到這了,更多相關Java Stream比較兩個List并取對象內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • 整理很詳細的Java正則表達式使用大全

    整理很詳細的Java正則表達式使用大全

    這篇文章為大家整理了很詳細的Java正則表達式使用大全,大家在使用Java正則表達式的時候可查閱這篇文章,認為不錯的朋友可以收藏起來
    2015-12-12
  • fastjson全局日期序列化設置導致JSONField失效問題解決方案

    fastjson全局日期序列化設置導致JSONField失效問題解決方案

    這篇文章主要介紹了fastjson通過代碼指定全局序列化返回時間格式,導致使用JSONField注解標注屬性的特殊日期返回格式失效問題的解決方案
    2023-01-01
  • Spring?boot集成easy?excel實現(xiàn)導入導出功能

    Spring?boot集成easy?excel實現(xiàn)導入導出功能

    這篇文章主要介紹了Spring?boot集成easy?excel實現(xiàn)導入導出操作,使用easyexcel,首先要引入easyexcel的maven依賴,具體的版本根據(jù)你的需求去設置,本文結合實例代碼講解的非常詳細,需要的朋友可以參考下
    2024-05-05
  • SpringBoot 下在 yml 中的 logging 日志配置方法

    SpringBoot 下在 yml 中的 logging 日志配置方法

    logging 配置主要用于控制應用程序的日志輸出行為,可以通過配置定制日志的格式、級別、輸出位置等,這篇文章主要介紹了SpringBoot 下在 yml 中的 logging 日志配置,需要的朋友可以參考下
    2024-06-06
  • SpringBoot AOP AspectJ切面技術介紹與實現(xiàn)方式

    SpringBoot AOP AspectJ切面技術介紹與實現(xiàn)方式

    這篇文章主要介紹了Springboot如何使用Aspectj實現(xiàn)AOP面向切面編程,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-10-10
  • Java 使用 OPC UA的步驟詳解

    Java 使用 OPC UA的步驟詳解

    使用Java與OPC UA (OPC Unified Architecture) 進行通信,可以使用開源的Eclipse Milo庫,下面給大家介紹使用Eclipse Milo庫與OPC UA服務器進行交互的步驟,感興趣的朋友跟隨小編一起看看吧
    2026-01-01
  • springboot?vue測試平臺開發(fā)調(diào)通前后端環(huán)境實現(xiàn)登錄

    springboot?vue測試平臺開發(fā)調(diào)通前后端環(huán)境實現(xiàn)登錄

    這篇文章主要介紹了springboot?vue測試平臺開發(fā)調(diào)通前后端環(huán)境實現(xiàn)登錄詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-05-05
  • Mybatis兩級緩存可能導致的問題詳細講解

    Mybatis兩級緩存可能導致的問題詳細講解

    MyBatis作為一款流行的持久層框架,在數(shù)據(jù)處理和緩存管理方面有著廣泛的應用,其中,二級緩存作為其重要的緩存機制,對于提升應用性能具有重要作用,但同時也存在一些潛在的問題,這篇文章主要介紹了Mybatis兩級緩存可能導致問題的相關資料,需要的朋友可以參考下
    2025-07-07
  • SpringBoot連接Redis集群教程

    SpringBoot連接Redis集群教程

    這篇文章主要介紹了SpringBoot連接Redis集群教程,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2025-06-06
  • BeanUtils.copyProperties復制對象結果為空的原因分析

    BeanUtils.copyProperties復制對象結果為空的原因分析

    這篇文章主要介紹了BeanUtils.copyProperties復制對象結果為空的原因分析,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-06-06

最新評論

新兴县| 石城县| 永寿县| 铁岭县| 文登市| 铁岭县| 呈贡县| 闽侯县| 庆安县| 苏尼特右旗| 洛扎县| 德阳市| 长子县| 商河县| 泰安市| 崇仁县| 靖西县| 咸阳市| 古交市| 余江县| 平舆县| 开阳县| 页游| 霞浦县| 南溪县| 旅游| 介休市| 上林县| 江安县| 元阳县| 石景山区| 南昌市| 东港市| 鸡西市| 肃南| 皋兰县| 石屏县| 双柏县| 汽车| 黄冈市| 铜山县|