当前位置: 首页 > 知识库问答 >
问题:

Java 16的stream.tolist()和stream.collect(collectors.tolist())的区别?

鄂坚
2023-03-14
var newList = someCollection.stream()
    .map(x -> mapX(x))
    .filter(x -> filterX(x))
    .toList();

// vs.

var oldList = someCollection.stream()
    .map(x -> mapX(x))
    .filter(x -> filterX(x))
    .collect(Collectors.toList());

(这个问题类似于stream.tolist()会比collectors.tolist()表现得更好,但侧重于行为,而不仅仅是性能。)

共有1个答案

乌灿
2023-03-14

一个区别是stream.tolist()提供了一个list实现,该实现是不可变的(类型immutablecollections.listn,不能添加或排序),类似于list.of()提供的实现,与stream.collect()提供的可变的(可以更改和排序)arraylist相反。

演示:

import java.util.stream.Stream;
import java.util.List;

public class Main {
    public static void main(String[] args) {
        List<String> list = Stream.of("Hello").toList();
        System.out.println(list);
        list.add("Hi");
    }
}

产出:

[Hello]
Exception in thread "main" java.lang.UnsupportedOperationException
    at java.base/java.util.ImmutableCollections.uoe(ImmutableCollections.java:142)
    at java.base/java.util.ImmutableCollections$AbstractImmutableCollection.add(ImmutableCollections.java:147)
    at Main.main(Main.java:8)
import java.util.stream.Stream;
import java.util.List;

public class Main {
    public static void main(String[] args) {
        List<Object> list = Stream.of(null, null).toList();
        System.out.println(list);
    }
}

产出:

[null, null]

另一方面,list.of(null,null)抛出NullPointerException

import java.util.List;

public class Main {
    public static void main(String[] args) {
        List<Object> list = List.of(null, null);
    }
}

产出:

Exception in thread "main" java.lang.NullPointerException
    at java.base/java.util.Objects.requireNonNull(Objects.java:208)
    at java.base/java.util.ImmutableCollections$List12.<init>(ImmutableCollections.java:453)
    at java.base/java.util.List.of(List.java:827)
    at Main.main(Main.java:5)
    null
 类似资料:
  • 主要内容:Java16弃用的功能,Java16移除的功能Java16弃用的功能 ThreadGroup 方法,如 stop、destroy、isDestroyed、setDaemon 和 isDaemon 方法已被弃用,并将在未来版本中删除。这些销毁线程组的 API/机制存在缺陷,这种支持显式或自动销毁线程组的方法已被最终弃用。 诸如 sigset、signal 之类的信号链 API 已过时,不推荐使用它们。sigaction 是跨平台的,并且支持多线

  • 主要内容:Java16 instanceof的模式匹配的语法,Java16 instanceof的模式匹配示例Java 14 引入了 instanceof 运算符以将类型测试模式作为预览功能。类型测试模式有一个谓词来指定具有单个绑定变量的类型。它仍然是 Java 15 中的预览功能。在 Java 16 中,此功能现已成为标准交付的一部分。 Java16 instanceof的模式匹配的语法 Java16 instanceof的模式匹配示例 ApiTester.java 编译并运行程序 输出结果为

  • 主要内容:Java16 Record类的示例Java 14 引入了一个新的类类型Record作为预览功能,以促进不可变数据对象的创建。Java 15 进一步增强了记录类型。在 Java 16 中,Record现在是 JDK 的标准功能。 Java16 Record类的示例 ApiTester.java 编译并运行程序 输出结果为  

  • 主要内容:Java16的新功能Java 16 是一个主要功能版本,它为 JAVA 带来了许多特定于 JVM 的更改和特定于语言的更改。它遵循 Java 发布日程推出 Java 10,并于 2021 年 3 月发布,距 Java 15 发布仅六个月。 Java 16 是非 LTS 版本。 Java16的新功能 以下是 Java 16 中引入的主要新功能。 JEP 338 : Vector API (Incubator) - 引入

  • 本文向大家介绍& 和 && 的区别?相关面试题,主要包含被问及& 和 && 的区别?时的应答技巧和注意事项,需要的朋友参考一下 &运算符是:逻辑与;&&运算符是:短路与。 &和&&在程序中最终的运算结果是完全一致的,只不过&&存在短路现象,当&&运算符左边的表达式结果为false的时候,右边的表达式不执行,此时就发生了短路现象。如果是&运算符,那么不管左边的表达式是true还是false,右边表达

  • 本文向大家介绍AdaBoost和GBDT的区别,AdaBoost和GBDT的区别?相关面试题,主要包含被问及AdaBoost和GBDT的区别,AdaBoost和GBDT的区别?时的应答技巧和注意事项,需要的朋友参考一下 参考回答: AdaBoost通过调整错分的数据点的权重来改进模型,而GBDT是从负梯度的方向去拟合改进模型。 AdaBoost改变了训练数据的权值,即样本的概率分布,减少上一轮被正