Java合并两个List后并去掉重复项的两种做法

 更新时间:2023年10月24日 09:20:50   作者:逆流°只是风景-bjhxcc  
工作中很多时候需要用到合并两个List并去除其中的重复内容,这是一个很简单的操作,实现的方法也多种多样,这篇文章主要给大家介绍了关于Java合并两个List后并去掉重复项的两种做法,需要的朋友可以参考下

前言

工作中很多时候需要用到合并两个List并去除其中的重复内容,这是一个很简单的操作,实现的方法也多种多样。

下面以具体实例展示给大家~

一、使用stream方式进行去重(需要jdk1.8及以上)

String[] arr1 = {"a", "b", "c", "d", "e", "f"};
List<String> listA = new ArrayList<>(Arrays.asList(arr1));
 
String[] arr2 = {"d", "e", "f", "g", "h"};
List<String> listB = new ArrayList<>(Arrays.asList(arr2));

List<String> collect = Stream.of(listA, listB)
                .flatMap(Collection::stream)
                .distinct()
                .collect(Collectors.toList());

可以很清楚的看出通过Stream完成的代码看上去更加简洁流畅

二、使用HashSet集合的方式进行去重

String[] arr1 = {"a", "b", "c", "d", "e", "f"};
List<String> listA = new ArrayList<>(Arrays.asList(arr1));

String[] arr2 = {"d", "e", "f", "g", "h"};
 List<String> listB = new ArrayList<>(Arrays.asList(arr2));

Set<String> set = new HashSet<>(listA);
set.addAll(listB);
List<String> list = new ArrayList<>(set);
System.out.println(list);

这样做后的list就是合并并去重后的结果

附:利用Java 8的Map.merge()方法

Java 8中的Map类提供了一个merge()方法,可以方便地对Map中的键值对进行合并操作。我们可以先将需要保留的List中的元素转换成一个Map,然后遍历另一个List进行合并操作。

示例代码如下:

使用 Java 8 的 Stream API,结合 Collectors.toMap() 和 merge() 方法来实现。具体实现步骤如下:

将两个 list 合并为一个 list;

将合并后的 list 转为 Stream;

使用 Collectors.toMap() 方法将 Stream 中的元素转为 Map;

在 toMap() 方法中指定 key 和 value,对于重复的 key,使用 merge() 方法合并 value;

将 Map 中的 value 转为 list,作为最终的结果。

下面是代码示例:

import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

public class MergeListExample {

    public static void main(String[] args) {
        List<String> list1 = new ArrayList<>();
        list1.add("A");
        list1.add("B");
        list1.add("C");
        list1.add("D");

        List<String> list2 = new ArrayList<>();
        list2.add("C");
        list2.add("D");
        list2.add("E");
        list2.add("F");

        List<String> mergedList = mergeLists(list1, list2);

        System.out.println("Merged list with duplicates: " + mergedList);

        List<String> distinctList = mergedList.stream().distinct().collect(Collectors.toList());

        System.out.println("Distinct merged list: " + distinctList);
    }

    private static List<String> mergeLists(List<String> list1, List<String> list2) {
        List<String> mergedList = new ArrayList<>(list1);
        mergedList.addAll(list2);
        Map<String, String> map = mergedList.stream()
                .collect(Collectors.toMap(s -> s, s -> s, (s1, s2) -> s1));
        return new ArrayList<>(map.values());
    }
}

该示例中,我们首先定义了两个 list,然后调用了 mergeLists() 方法来合并两个 list 并去重。在该方法中,我们先将两个 list 合并为一个 list,然后将其转为 Stream。接着使用 Collectors.toMap() 方法将 Stream 中的元素转为 Map,并在 toMap() 方法中指定 key 和 value,对于重复的 key,使用 merge() 方法合并 value。最后将 Map 中的 value 转为 list,作为最终的结果。

输出结果如下:

Merged list with duplicates: [A, B, C, D, C, D, E, F]
Distinct merged list: [A, B, C, D, E, F]

总结

到此这篇关于Java合并两个List后并去掉重复项的两种做法的文章就介绍到这了,更多相关Java合并List并去掉重复项内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • SpringBoot任务之定时任务相关知识总结

    SpringBoot任务之定时任务相关知识总结

    今天给大家整理的文章是SpringBoot定时任务的相关知识点,文中有非常详细的介绍及代码示例,对正在学习SpringBoot任务的小伙伴们很有帮助,需要的朋友可以参考下
    2021-06-06
  • SpringBoot之控制器的返回值处理方式

    SpringBoot之控制器的返回值处理方式

    这篇文章主要介绍了SpringBoot之控制器的返回值处理方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-07-07
  • mybatis深入讲解resultMap的定义及用法

    mybatis深入讲解resultMap的定义及用法

    MyBatis的每一个查询映射的返回类型都是ResultMap,当我们提供返回类型属性是resultType时,MyBatis会自动给我们把对应值赋给resultType所指定对象的属性,当我们提供返回类型是resultMap时,将数据库中列数据复制到对象的相应属性上,可以用于复制查询,两者不能同时用
    2022-04-04
  • MyBatis异常java.sql.SQLSyntaxErrorException的问题解决

    MyBatis异常java.sql.SQLSyntaxErrorException的问题解决

    使用mybatis插入数据时出现java.sql.SQLSyntaxErrorException异常,本文就来介绍一下MyBatis异常的问题解决,具有一定的参考价值,感兴趣的可以了解一下
    2023-08-08
  • SpringBoot配置文件中系统环境变量存在特殊字符的处理方式

    SpringBoot配置文件中系统环境变量存在特殊字符的处理方式

    这篇文章主要介绍了SpringBoot配置文件中系统环境变量存在特殊字符的处理方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-02-02
  • Springboot配置AOP的注解切点失效解决方案

    Springboot配置AOP的注解切点失效解决方案

    本文探讨了在Spring框架中使用AOP拦截静态方法调用的实现细节,重点在于ApplicationContext和ApplicationContextAware接口的使用差异,通过对比两种获取Bean的方式,最终解决了切点无法被拦截的问题
    2026-06-06
  • Springboot Filter中注入bean无效为null问题

    Springboot Filter中注入bean无效为null问题

    这篇文章主要介绍了Springboot Filter中注入bean无效为null问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-05-05
  • Java date format时间格式化操作示例

    Java date format时间格式化操作示例

    这篇文章主要介绍了Java date format时间格式化操作,结合具体实例形式分析了java针对日期时间进行格式化操作的相关实现技巧,需要的朋友可以参考下
    2017-03-03
  • java 较大数据量取差集,list.removeAll性能优化详解

    java 较大数据量取差集,list.removeAll性能优化详解

    这篇文章主要介绍了java 较大数据量取差集,list.removeAll性能优化详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-09-09
  • Spring事务和事务传播机制操作大全

    Spring事务和事务传播机制操作大全

    Spring中事务管理主要分为编程式事务和声明式事务,声明式事务推荐使用,声明式事务通过`@Transactional`注解实现,可以简化事务操作,本文给大家介绍Spring事务和事务传播机制,感兴趣的朋友跟随小编一起看看吧
    2025-12-12

最新评论