这篇文章将讨论如何使用 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 中加入两个列表的全部内容。