繁体   English   中英

Java8 - 如何添加列表<List<String> &gt; 列出<List<String> &gt;

[英]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);

这里有什么区别?

只要外部列表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);

不可变的外部列表

如果您想保留以前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);

结果

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

 [a, b, c] [d, e, f] [h, i, j] [k, l, m]

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

您的代码不起作用,因为Arrays.asList()返回

由指定数组支持的固定大小列表

https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/util/Arrays.html#asList(T...)

这意味着当您尝试添加更多元素时,表示List的数组中没有空间; 从而抛出UnsupportedOperationException

如果您想使用特定元素构建List并且还能够扩展其大小,那么您应该通过向其提供asList()方法返回的列表来使用类的转换构造函数。

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

您可以避免使用 addAll 函数并遍历 b 并添加到如下所示的 a:

for(innerList:b){
   a.add(innerList);
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM