本文正在参加「Java主题月 - Java Debug笔记活动」,详情查看 活动链接
问题
如何连接两个列表?
条件:不修改原始列表的情况下,不调用外部依赖库,是否存在比如下方法更加简单地方式:
List<String> newList = new ArrayList<String>();
newList.addAll(listOne);
newList.addAll(listTwo);
PS:最好是用一行代码实现!
回答
回答 1
Java 8 中:
List<String> newList = Stream.concat(listOne.stream(), listTwo.stream()).collect(Collectors.toList());
回答 2
List<String> newList = new ArrayList<String>(listOne);
newList.addAll(listTwo);
回答 3
使用 Apache commons-collections
库:
List<String> newList = ListUtils.union(list1, list2);
回答 4
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());
回答 5
你的需求之一是保留原始列表,如果创建一个新的列表并使用 addAll()
,那么实际上将对列表中的引用数量就增加了一倍。如果列表过长,就可能导致内存问题。
如果不需要修改连接的结果,那么就可以使用自定义列表来实现,从而避免上述情况。虽然使用自定义类实现不止一行,但使用起来却很简单。
public class CompositeUnmodifiableList<E> extends AbstractList<E> {
private final List<E> list1;
private final List<E> list2;
public CompositeUnmodifiableList(List<E> list1, List<E> list2) {
this.list1 = list1;
this.list2 = list2;
}
@Override
public E get(int index) {
if (index < list1.size()) {
return list1.get(index);
}
return list2.get(index-list1.size());
}
@Override
public int size() {
return list1.size() + list2.size();
}
}
使用方式如下:
List<String> newList = new CompositeUnmodifiableList<String>(listOne,listTwo);
出处
文章翻译自 Stack Overflow:How do I join two lists in Java?