在 Java 中加入两个列表的 10 种方法

这篇文章将讨论如何使用 Plain Java、Java 8、Guava 和 Apache Commons Collections 加入两个 Java 列表。

1.纯Java

使用 List.addAll()

List 接口提供 addAll(Collection) 将指定集合的所有元素附加到列表末尾的方法。我们可以按如下方式使用它:

// Java 中连接两个列表的通用方法
public static<T> List<T> merge(List<T> list1, List<T> list2)
{
    
    
    List<T> list = new ArrayList<>();
 
    list.addAll(list1);
    list.addAll(list2);
 
    return list;
}

我们还可以使用第一个列表初始化结果列表 ArrayList 构造函数,从而防止额外调用 addAll().

// Java 中连接两个列表的通用方法
public static<T> List<T> merge(List<T> list1, List<T> list2)
{
    
    
    List<T> list = new ArrayList<>(list1);
    list.addAll(list2);
 
    return list;
}     

双括号初始化

我们还可以使用双大括号初始化,它在内部创建一个匿名内部类,其中包含一个实例初始化程序。

// Java 中连接两个列表的通用方法
public static<T> List<T> merge(List<T> list1, List<T> list2)
{
    
    
    return new ArrayList<T>() {
    
    {
    
    
            addAll(list1);
            addAll(list2);
        }};
}

我们最好避免使用这种技术,因为每次使用它都会花费额外的课程。它还包含对封闭实例和任何捕获对象的隐藏引用。这可能会导致内存泄漏或序列化问题。

使用 Collections.addAll()

Collections 类提供了几个对集合进行操作的有用的静态实用程序方法。一种这样的方法是 addAll(Collection, T[]) 将所有指定元素添加到指定集合中。

// 在 Java 中连接两个列表的方法
public static List<String> merge(List<String> list1, List<String> list2)
{
    
    
    List<String> list = new ArrayList<>();
 
    Collections.addAll(list, list1.toArray(new String[0]));
    Collections.addAll(list, list2.toArray(new String[0]));
 
    return list;
}

这种方法类似于 List.addAll() 但可能会运行得更快。

2. 使用 Java 8

我们还可以使用 Java 8 Stream 来加入两个列表。

使用 Stream.of()flatMap()

在这里,我们使用静态工厂方法获取了一个由两个列表中的元素组成的流 Stream.of() 并使用 a 将所有元素累积到一个新列表中 Collector.

// Java 中连接两个列表的通用方法
public static<T> List<T> merge(List<T> list1, List<T> list2)
{
    
    
    return Stream.of(list1, list2)
                .flatMap(x -> x.stream())
                .collect(Collectors.toList());
}

使用 Stream.of()Stream.forEach()

我们可以通过累积所有元素来避免使用收集器 forEach() 相反,如下所示:

// Java 中连接两个列表的通用方法
public static<T> List<T> merge(List<T> list1, List<T> list2)
{
    
    
    List<T> list = new ArrayList<>();
    Stream.of(list1, list2).forEach(list::addAll);
 
    return list;
}

使用 Stream.concat()

Java Stream 提供 concat() 它将两个流作为输入并创建一个延迟连接的流,其元素是第一个流的所有元素,然后是第二个流的所有元素。

// Java 中连接两个列表的通用方法
public static<T> List<T> merge(List<T> list1, List<T> list2)
{
    
    
    return Stream.concat(list1.stream(), list2.stream())
                .collect(Collectors.toList());
}

使用 List.addAll()

这是一个轻微的变化 List.addAll() 前面讨论过在 Java 8 及更高版本中使用流的方法:


// Java 中连接两个列表的通用方法
public static<T> List<T> merge(List<T> list1, List<T> list2)
{
    
    
    List<T> list = list1.stream().collect(Collectors.toList());
    list.addAll(list2);
 
    return list;
}

3. 使用 Guava 库

Guava’s Iterables 类提供了许多静态实用方法,用于操作或返回类型的对象 Iterable.

使用 Iterables.concat()

concat() 可用于将两个可迭代对象组合成一个可迭代对象。


// Java 中连接两个列表的通用方法
public static<T> List<T> merge(List<T> list1, List<T> list2) {
    
    
    return Lists.newArrayList(Iterables.concat(list1, list2));
}

使用 Iterables.addAll()

addAll() 将可迭代的所有元素添加到集合中。我们可以以与 Collections 类似的方式使用它 addAll() 方法。

// Java 中连接两个列表的通用方法
public static<T> List<T> merge(List<T> list1, List<T> list2)
{
    
    
    List<T> list = Lists.newArrayList();
 
    Iterables.addAll(list, list1);
    Iterables.addAll(list, list2);
 
    return list;
}

4. 使用 Apache Commons 集合

Apache Commons 集合 ListUtils 类提供 union() 方法将两个列表作为输入并返回一个新列表,其中包含附加到第一个列表的第二个列表。

// Java 中连接两个列表的通用方法
public static<T> List<T> merge(List<T> list1, List<T> list2) {
    
    
    return ListUtils.union(list1, list2);
}

这就是在 Java 中加入两个列表的全部内容。

猜你喜欢

转载自blog.csdn.net/qq_43842093/article/details/132137369