条件:不修改原有列表;只使用JDK,没有外部库。单行程序或JDK 1.3版本的加分项。

有没有比这更简单的方法:

List<String> newList = new ArrayList<String>();
newList.addAll(listOne);
newList.addAll(listTwo);

当前回答

如果目标列表是预先声明的,你可以做一个联机程序。

(newList = new ArrayList<String>(list1)).addAll(list2);

其他回答

另一个使用Java8流的线性解决方案,因为flatMap解决方案已经发布,这里是一个没有flatMap的解决方案

List<E> li = lol.stream().collect(ArrayList::new, List::addAll, List::addAll);

or

List<E> ints = Stream.of(list1, list2).collect(ArrayList::new, List::addAll, List::addAll);

code

    List<List<Integer>> lol = Arrays.asList(Arrays.asList(1, 2, 3), Arrays.asList(4, 5, 6));
    List<Integer> li = lol.stream().collect(ArrayList::new, List::addAll, List::addAll);
    System.out.println(lol);
    System.out.println(li);

输出

[[1, 2, 3], [4, 5, 6]]
[1, 2, 3, 4, 5, 6]

在一般情况下,如果不介绍您自己的实用程序方法,我无法改进双行程序,但如果您确实有字符串列表,并且您愿意假设这些字符串不包含逗号,您可以使用这个长一行程序:

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兼容的(尽管我还没有测试)。也不建议用于生产代码;-)

你可以通过一个静态导入和一个helper类来实现

注意这个类的泛化可能还有待改进

public class Lists {

   private Lists() { } // can't be instantiated

   public static List<T> join(List<T>... lists) {
      List<T> result = new ArrayList<T>();
      for(List<T> list : lists) {
         result.addAll(list);
      }
      return results;
   }

}

然后你就可以做

import static Lists.join;
List<T> result = join(list1, list2, list3, list4);

另一个Java 8一行代码:

List<String> newList = Stream.of(listOne, listTwo)
                            .flatMap(Collection::stream)
                            .collect(Collectors.toList());

另外,由于Stream.of()是可变的,您可以连接任意多的列表。

List<String> newList = Stream.of(listOne, listTwo, listThree)
                            .flatMap(Collection::stream)
                            .collect(Collectors.toList());

下面是一个使用两行代码的java 8解决方案:

List<Object> newList = new ArrayList<>();
Stream.of(list1, list2).forEach(newList::addAll);

请注意,在以下情况下不应使用此方法

newList的来源是未知的,它可能已经与其他线程共享 修改newList的流是并行流,对newList的访问不是同步的,也不是线程安全的

由于副作用的考虑。

上述两个条件都不适用于上述连接两个列表的情况,因此这是安全的。

基于我对另一个问题的回答。