此问题在此处已有答案:
Stream and lazy evaluation(3个答案)
21小时前关闭.
public class ToSort {
private String sortBy;
public ToSort(String sortBy) {
this.sortBy = sortBy;
}
public String getSortBy() {
return sortBy;
}
public static void main(String[] args) {
Comparator<ToSort> comp = Comparator.comparing(ToSort::getSortBy);
ToSort o1 = new ToSort("TEST");
ToSort o2 = new ToSort(null);
List list = new ArrayList<>();
list.add(o1);
list.add(o2);
list.stream().sorted(comp); // ok
list.sort(comp); // NullPointerException
}
}
输出量:
Exception in thread "main" java.lang.NullPointerException
at java.base/java.util.Comparator.lambda$comparing$77a9974f$1(Comparator.java:469)
at java.base/java.util.TimSort.countRunAndMakeAscending(TimSort.java:355)
at java.base/java.util.TimSort.sort(TimSort.java:220)
at java.base/java.util.Arrays.sort(Arrays.java:1515)
at java.base/java.util.ArrayList.sort(ArrayList.java:1750)
at com.oxand.simeox.model.pojo.ToSort.main(ToSort.java:28)
当给定空值并使用相同的比较器时,为什么Stream.sorted方法不像List.sort方法那样抛出NullPointerException?
1条答案
按热度按时间8mmmxcuj1#
java 8 API表示关于流:
流操作分为中间(产生流)操作和终端(产生值或副作用)操作。中间操作总是惰性的。
Stream.sorted是传回新数据流的中继作业,而且数据流永远是惰性的。如果执行终端作业(例如Stream.forEach或Stream.Collect),就会耗用数据流管缐,并观察到相同的行为(NullPointerException)。