条件:不修改原有列表;只使用JDK,没有外部库。单行程序或JDK 1.3版本的加分项。
有没有比这更简单的方法:
List<String> newList = new ArrayList<String>();
newList.addAll(listOne);
newList.addAll(listTwo);
条件:不修改原有列表;只使用JDK,没有外部库。单行程序或JDK 1.3版本的加分项。
有没有比这更简单的方法:
List<String> newList = new ArrayList<String>();
newList.addAll(listOne);
newList.addAll(listTwo);
当前回答
我不是说这很简单,但你提到了一句话的奖励;-)
Collection mergedList = Collections.list(new sun.misc.CompoundEnumeration(new Enumeration[] {
new Vector(list1).elements(),
new Vector(list2).elements(),
...
}))
其他回答
可能并不简单,但有趣而丑陋:
List<String> newList = new ArrayList<String>() { { addAll(listOne); addAll(listTwo); } };
不要在产品代码中使用它……;)
不是更简单,但没有调整开销:
List<String> newList = new ArrayList<>(listOne.size() + listTwo.size());
newList.addAll(listOne);
newList.addAll(listTwo);
Java 8(流。and Stream.concat)
建议的解决方案是针对三个列表,但它也可以应用于两个列表。在Java 8中,我们可以使用Stream。属于或属于溪流。合并多个数组:
List<String> result1 = Stream.concat(Stream.concat(list1.stream(),list2.stream()),list3.stream()).collect(Collectors.toList());
List<String> result2 = Stream.of(list1,list2,list3).flatMap(Collection::stream).collect(Collectors.toList());
流。Concat接受两个流作为输入,并创建一个惰性连接流,其元素是第一个流的所有元素,后面是第二个流的所有元素。因为我们有三个列表,所以我们已经使用了这个方法(Stream.concat)两次。
我们还可以用一个方法编写一个实用程序类,该方法接受任意数量的列表(使用varargs),并返回一个连接的列表,如下所示:
public static <T> List<T> concatenateLists(List<T>... collections) {
return Arrays.stream(collections).flatMap(Collection::stream).collect(Collectors.toList());
}
那么我们可以使用这个方法为:
List<String> result3 = Utils.concatenateLists(list1,list2,list3);
您可以创建通用的Java 8实用程序方法来连接任意数量的列表。
@SafeVarargs
public static <T> List<T> concat(List<T>... lists) {
return Stream.of(lists).flatMap(List::stream).collect(Collectors.toList());
}
简短一点的是:
List<String> newList = new ArrayList<String>(listOne);
newList.addAll(listTwo);