Java8 - 如何将 List<List<String>> 添加到 List<List<String>>
Java8 - How to add List<List<String>> to List<List<String>>
我有两个 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);
但是,它不起作用并抛出异常。
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)
下面的代码有效:
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);
这里有什么区别?
您可以避免使用 addAll 函数并遍历 b 并添加到 a,如下所示:
for(innerList:b){
a.add(innerList);
}
只要 外部列表 a
是可变的并且您不介意修改它,您对 a.addAll(b)
的尝试就有效。
可变外部列表:
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);
不可变外部列表
如果您想保留以前的 a
和 b
列表 and/or 生成一个新列表,请使用 java-stream:
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);
结果
两种方式共享相同的输出:
[a, b, c]
[d, e, f]
[h, i, j]
[k, l, m]
对于这种组合,内部列表是否不可变并不重要。
您的代码无效,因为 Arrays.asList()
returns
a fixed-size list backed by the specified array
https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/util/Arrays.html#asList(T...)
这意味着当您尝试添加更多元素时,在表示 List
的数组中没有 space;因此抛出一个UnsupportedOperationException
.
如果您想使用特定元素构建 List
并且还能够扩展其大小,那么您应该使用 class' 转换构造函数,向其提供 class' 返回的列表=15=]方法。
List<List<String>> a = new ArrayList<>(Arrays.asList(new ArrayList<>(Arrays.asList("a", "b", "c"))));
List<List<String>> b = new ArrayList<>(Arrays.asList(new ArrayList<>(Arrays.asList("d", "e", "f"))));
a.addAll(b);
这样,您的外部列表和内部列表都会像实际的 List
一样运行,而不会在超过原始大小时抛出 UnsupportedOperationException
。
我有两个 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);
但是,它不起作用并抛出异常。
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)
下面的代码有效:
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);
这里有什么区别?
您可以避免使用 addAll 函数并遍历 b 并添加到 a,如下所示:
for(innerList:b){
a.add(innerList);
}
只要 外部列表 a
是可变的并且您不介意修改它,您对 a.addAll(b)
的尝试就有效。
可变外部列表:
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);
不可变外部列表
如果您想保留以前的 a
和 b
列表 and/or 生成一个新列表,请使用 java-stream:
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);
结果
两种方式共享相同的输出:
[a, b, c] [d, e, f] [h, i, j] [k, l, m]
对于这种组合,内部列表是否不可变并不重要。
您的代码无效,因为 Arrays.asList()
returns
a fixed-size list backed by the specified array
https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/util/Arrays.html#asList(T...)
这意味着当您尝试添加更多元素时,在表示 List
的数组中没有 space;因此抛出一个UnsupportedOperationException
.
如果您想使用特定元素构建 List
并且还能够扩展其大小,那么您应该使用 class' 转换构造函数,向其提供 class' 返回的列表=15=]方法。
List<List<String>> a = new ArrayList<>(Arrays.asList(new ArrayList<>(Arrays.asList("a", "b", "c"))));
List<List<String>> b = new ArrayList<>(Arrays.asList(new ArrayList<>(Arrays.asList("d", "e", "f"))));
a.addAll(b);
这样,您的外部列表和内部列表都会像实际的 List
一样运行,而不会在超过原始大小时抛出 UnsupportedOperationException
。