条件:不修改原有列表;只使用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);
当前回答
这很简单,只有一行,但是会将listTwo的内容添加到listOne。你真的需要把内容放到第三个列表里吗?
Collections.addAll(listOne, listTwo.toArray());
其他回答
在我看来最聪明的是:
/**
* @param smallLists
* @return one big list containing all elements of the small ones, in the same order.
*/
public static <E> List<E> concatenate (final List<E> ... smallLists)
{
final ArrayList<E> bigList = new ArrayList<E>();
for (final List<E> list: smallLists)
{
bigList.addAll(list);
}
return bigList;
}
在一般情况下,如果不介绍您自己的实用程序方法,我无法改进双行程序,但如果您确实有字符串列表,并且您愿意假设这些字符串不包含逗号,您可以使用这个长一行程序:
List<String> newList = new ArrayList<String>(Arrays.asList((listOne.toString().subString(1, listOne.length() - 1) + ", " + listTwo.toString().subString(1, listTwo.length() - 1)).split(", ")));
如果去掉泛型,这应该是JDK 1.4兼容的(尽管我还没有测试)。也不建议用于生产代码;-)
我最喜欢的方法是,使用流利的api和番石榴:
List<String> combined = ImmutableList.<String>builder().addAll(list1).addAll(list2).build()
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);
如果目标列表是预先声明的,你可以做一个联机程序。
(newList = new ArrayList<String>(list1)).addAll(list2);