条件:不修改原有列表;只使用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);
当前回答
下面是一个使用两行代码的java 8解决方案:
List<Object> newList = new ArrayList<>();
Stream.of(list1, list2).forEach(newList::addAll);
请注意,在以下情况下不应使用此方法
newList的来源是未知的,它可能已经与其他线程共享 修改newList的流是并行流,对newList的访问不是同步的,也不是线程安全的
由于副作用的考虑。
上述两个条件都不适用于上述连接两个列表的情况,因此这是安全的。
基于我对另一个问题的回答。
其他回答
在一般情况下,如果不介绍您自己的实用程序方法,我无法改进双行程序,但如果您确实有字符串列表,并且您愿意假设这些字符串不包含逗号,您可以使用这个长一行程序:
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兼容的(尽管我还没有测试)。也不建议用于生产代码;-)
简短一点的是:
List<String> newList = new ArrayList<String>(listOne);
newList.addAll(listTwo);
下面是一个使用两行代码的java 8解决方案:
List<Object> newList = new ArrayList<>();
Stream.of(list1, list2).forEach(newList::addAll);
请注意,在以下情况下不应使用此方法
newList的来源是未知的,它可能已经与其他线程共享 修改newList的流是并行流,对newList的访问不是同步的,也不是线程安全的
由于副作用的考虑。
上述两个条件都不适用于上述连接两个列表的情况,因此这是安全的。
基于我对另一个问题的回答。
使用Helper类。
我建议:
public static <E> Collection<E> addAll(Collection<E> dest, Collection<? extends E>... src) {
for(Collection<? extends E> c : src) {
dest.addAll(c);
}
return dest;
}
public static void main(String[] args) {
System.out.println(addAll(new ArrayList<Object>(), Arrays.asList(1,2,3), Arrays.asList("a", "b", "c")));
// does not compile
// System.out.println(addAll(new ArrayList<Integer>(), Arrays.asList(1,2,3), Arrays.asList("a", "b", "c")));
System.out.println(addAll(new ArrayList<Integer>(), Arrays.asList(1,2,3), Arrays.asList(4, 5, 6)));
}
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);