Java 16的Stream.toList()和Stream.collect(Collectors.toList())的区别? [英] Differences of Java 16's Stream.toList() and Stream.collect(Collectors.toList())?

查看:182
本文介绍了Java 16的Stream.toList()和Stream.collect(Collectors.toList())的区别?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

JDK 16现在直接包含了 toList()方法在 Stream 实例上.在以前的Java版本中,您总是必须使用 collect 方法并提供一个 Collector 实例.

新方法显然减少了要键入的字符.两种方法是可以互换的还是应该注意的细微差别?

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

(此问题类似于 Would Stream.toList()会执行比Collectors.toList()更好,但只关注行为,而不是(仅)关注性能.)

解决方案

一个区别是 Stream.toList()提供了一个不变的 List 实现(类型 ImmutableCollections.ListN (无法添加或排序),类似于 List.of()提供的内容,与可变的(可以更改和排序)相反.ArrayList Stream.collect(Collectors.toList())提供.

演示:

  import java.util.stream.Stream;导入java.util.List;公共班级主要{公共静态void main(String [] args){List< String>list = Stream.of("Hello").toList();System.out.println(list);list.add("Hi");}} 

输出:

  [你好]线程"main"中的异常java.lang.UnsupportedOperationException在java.base/java.util.ImmutableCollections.uoe(ImmutableCollections.java:142)在java.base/java.util.ImmutableCollections $ AbstractImmutableCollection.add(ImmutableCollections.java:147)在Main.main(Main.java:8) 

请检查本文以获取更多详细信息.

更新:

有趣的是, Stream.toList()成功返回包含 null s的列表.

  import java.util.stream.Stream;导入java.util.List;公共班级主要{公共静态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;公共班级主要{公共静态void main(String [] args){List< Object>list = List.of(null,null);}} 

输出:

 线程"main"中的异常;java.lang.NullPointerException在java.base/java.util.Objects.requireNonNull(Objects.java:208)在java.base/java.util.ImmutableCollections $ List12中.< init>(ImmutableCollections.java:453)在java.base/java.util.List.of(List.java:827)在Main.main(Main.java:5) 

注意:我已经使用 openjdk-16-ea + 34_osx-x64 来编译和执行Java SE 16代码./p>

有用的资源:

  1. JDK Bug# JDK-8180352
  2. 使用单个null参数调用Java varargs方法吗?

JDK 16 now includes a toList() method directly on Stream instances. In previous Java versions, you always had to use the collect method and provide a Collector instance.

The new method is obviously fewer characters to type. Are both methods interchangeable or are there subtle differences one should be aware of?

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());

(This question is similar to Would Stream.toList() perform better than Collectors.toList(), but focused on behavior and not (only) on performance.)

解决方案

One difference is that Stream.toList() provides a List implementation that is immutable (type ImmutableCollections.ListN that cannot be added to or sorted) similar to that provided by List.of() and in contrast to the mutable (can be changed and sorted) ArrayList provided by Stream.collect(Collectors.toList()).

Demo:

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");
    }
}

Output:

[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)

Please check this article for more details.

Update:

Interestingly, Stream.toList() returns a nulls-containing list successfully.

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);
    }
}

Output:

[null, null]

On the other hand, List.of(null, null) throws NullPointerException.

import java.util.List;

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

Output:

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)

Note: I've used openjdk-16-ea+34_osx-x64 to compile and execute the Java SE 16 code.

Useful resources:

  1. JDK Bug#JDK-8180352
  2. Calling Java varargs method with single null argument?

这篇关于Java 16的Stream.toList()和Stream.collect(Collectors.toList())的区别?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆