gpt4 book ai didi

java - Java 16的Stream.toList()和Stream.collect(Collectors.toList())的区别?

转载 作者:行者123 更新时间:2023-12-03 17:44:30 33 4
gpt4 key购买 nike

JDK 16 now includes a toList() method directly on Stream instances。在以前的Java版本中,您始终必须使用collect方法并提供Collector实例。
新方法显然减少了要键入的字符。两种方法是可互换的还是应该注意的细微差别?

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());
(此问题类似于 Would Stream.toList() perform better than Collectors.toList(),但关注的是行为,而不是(仅)关注性能。)

最佳答案

一个区别是Stream.toList()提供了一个List实现,该实现是不变的(不能添加或排序的ImmutableCollections.ListN类型)类似于List.of()提供的实现,而与ArrayList提供的可变(可以更改和排序)Stream.collect(Collectors.toList())相反。
演示:

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)
请检查 this article了解更多详细信息。
更新:
有趣的是, Stream.toList()成功返回了一个包含 null s的列表。
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)
注意:我已经使用 openjdk-16-ea + 34_osx-x64 来编译和执行Java SE 16代码。
有用的资源:
  • JDK错误#JDK-8180352
  • Calling Java varargs method with single null argument?
  • 关于java - Java 16的Stream.toList()和Stream.collect(Collectors.toList())的区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65969919/

    33 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com