Java 8 - 在Arrays.asList和Stream.of之间的一行差异中初始化List

djm*_*.im 3 java arrays list java-8

我想创建一个城市名称列表.我知道两种方式.

List<String> cities = Stream.of("Paris", "London", "New York", "Tokyo").collect(Collectors.toList());

List<String> cities = Arrays.asList("Paris", "London", "New York", "Tokyo");
Run Code Online (Sandbox Code Playgroud)

Stream.of(..).collect(..)和之间有什么区别Arrays.asList(..)

azr*_*zro 7

  1. Stream.collect()将返回一个List<>非固定大小(具有当前实现toList())

    List<String> cities = Stream.of("Paris", "Tokyo").collect(Collectors.toList());
    cities.add("foo"); // OK
    
    Run Code Online (Sandbox Code Playgroud)

    在创建基本的情况下List使用它是无用的Stream,在需要在收集数据之前进行操作时使用它们,如过滤器,地图,......


  1. Arrays.asList()将返回List<>固定大小:see Documentation

    List<String> cities = Arrays.asList("Paris", "London", "New York", "Tokyo");
    cities.add("bar"); // NOK : java.lang.UnsupportedOperationException
    
    Run Code Online (Sandbox Code Playgroud)

    当你快速需要一个List元素,迭代或其他简单的东西但不再需要时,可以使用它,然后使用List返回到第1点的实现.


构造.collect(Collectors.toCollection(ArrayList::new));将保证返回的列表是可变的,因为对toList 返回的List的类型,可变性,可序列化或线程安全性没有保证.

  • 未指定*可以修改`Collectors.toList`返回的列表,尽管这样做恰好在当前的JDK版本(8到10)中有效. (2认同)
  • `Stream.of("Paris","Tokyo").collect(Collectors.toCollection(ArrayList :: new));`将保证返回的列表是可变的,因为[`toList`对类型没有保证,返回列表的可变性,可串行性或线程安全性](https://docs.oracle.com/javase/8/docs/api/java/util/stream/Collectors.html#toList--). (2认同)