Java8 - 如何将 List<List<String>> 添加到 List<List<String>>

zxw*_*ang 4 java arrays collections list

我有两个List<List<String>>并且想将它们连接起来。

这是我的代码:

List<List<String>> a = Arrays.asList(Arrays.asList("a", "b", "c"));
List<List<String>> b = Arrays.asList(Arrays.asList("d", "e", "f"));
a.addAll(b);
Run Code Online (Sandbox Code Playgroud)

但是,它不起作用并引发异常。

Exception in thread "main" java.lang.UnsupportedOperationException
    at java.util.AbstractList.add(AbstractList.java:148)
    at java.util.AbstractList.add(AbstractList.java:108)
    at java.util.AbstractCollection.addAll(AbstractCollection.java:344)
Run Code Online (Sandbox Code Playgroud)

下面的代码有效:

List<List<String>> a = new ArrayList<>();
a.add(Arrays.asList("a", "b", "c"));
List<List<String>> b = new ArrayList<>();
b.add(Arrays.asList("d", "e", "f"));
a.addAll(b);
Run Code Online (Sandbox Code Playgroud)

这里有什么区别?

Nik*_*las 8

a.addAll(b)只要外部列表 a是可变的并且您不介意修改它,您的尝试就有效。

可变外部列表:

List<List<String>> a = new ArrayList<>(List.of(
        List.of("a", "b", "c"),
        List.of("d", "e", "f")));

List<List<String>> b = new ArrayList<>(List.of(
        List.of("h", "i", "j"),
        List.of("k", "l", "m")));

a.addAll(b); // the 'a' will contain all the inner lists

a.forEach(System.out::println);
Run Code Online (Sandbox Code Playgroud)

不可变的外部列表

如果您想保留前者ab列表和/或生成新列表,请使用

List<List<String>> a = List.of(
        List.of("a", "b", "c"),
        List.of("d", "e", "f"));

List<List<String>> b = List.of(
        List.of("h", "i", "j"),
        List.of("k", "l", "m"));

List<List<String>> result = Stream.of(a, b)
        .flatMap(Collection::stream)
        .collect(Collectors.toList());

result.forEach(System.out::println);
Run Code Online (Sandbox Code Playgroud)

结果

两种方式共享相同的输出:

[a, b, c]
[d, e, f]
[h, i, j]
[k, l, m]
Run Code Online (Sandbox Code Playgroud)

内部列表是否不可变对于这种组合并不重要。