条件:不修改原有列表;只使用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(流。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);
其他回答
没有办法接近一行程序,但我认为这是最简单的:
List<String> newList = new ArrayList<String>(l1);
newList.addAll(l2);
for(String w:newList)
System.out.printf("%s ", w);
下面是一个使用两行代码的java 8解决方案:
List<Object> newList = new ArrayList<>();
Stream.of(list1, list2).forEach(newList::addAll);
请注意,在以下情况下不应使用此方法
newList的来源是未知的,它可能已经与其他线程共享 修改newList的流是并行流,对newList的访问不是同步的,也不是线程安全的
由于副作用的考虑。
上述两个条件都不适用于上述连接两个列表的情况,因此这是安全的。
基于我对另一个问题的回答。
简短一点的是:
List<String> newList = new ArrayList<String>(listOne);
newList.addAll(listTwo);
使用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)));
}
在我看来最聪明的是:
/**
* @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;
}