java 当给定空值时,为什么Stream.sorted方法不抛出NullPointerException作为List.sort方法?[duplicate]

anauzrmj  于 2022-12-10  发布在  Java
关注(0)|答案(1)|浏览(332)

此问题在此处已有答案

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?

8mmmxcuj

8mmmxcuj1#

java 8 API表示关于流:
流操作分为中间(产生流)操作和终端(产生值或副作用)操作。中间操作总是惰性的。
Stream.sorted是传回新数据流的中继作业,而且数据流永远是惰性的。如果执行终端作业(例如Stream.forEach或Stream.Collect),就会耗用数据流管缐,并观察到相同的行为(NullPointerException)。

相关问题