如何连接两个列表 | Java Debug 笔记

258 阅读1分钟

本文正在参加「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?