Java Stream API:collect(Collectors.toMap()) 返回什么样的映射方法?

har*_*814 4 java java-stream collectors

什么样的地图“嗯”?

 Map<String,Person> hm;

    try (BufferedReader br = new BufferedReader(new FileReader("person.txt")) {
        hm = br.lines().map(s -> s.split(","))
               .collect(Collectors.toMap(a -> a[0] , a -> new Person(a[0],a[1],Integer.valueOf(a[2]),Integer.valueOf(a[3]))));
Run Code Online (Sandbox Code Playgroud)

它取决于声明吗?

Map<String,Person> hm = new HashMap<>();
Map<String,Person> hm = new TreeMap<>();
Run Code Online (Sandbox Code Playgroud)

Era*_*ran 7

不,初始化引用的变量hm是没有意义的,因为流管道创建了一个新Map实例,然后您将其分配给hm.

实际返回的Map实现是一个实现细节。目前它HashMap默认返回 a ,但您可以Map通过使用不同的toMap().

你可以在这里看到一个实现:

public static <T, K, U>
Collector<T, ?, Map<K,U>> toMap(Function<? super T, ? extends K> keyMapper,
                                Function<? super T, ? extends U> valueMapper) {
    return toMap(keyMapper, valueMapper, throwingMerger(), HashMap::new);
}
Run Code Online (Sandbox Code Playgroud)

你可以看到它传递了一个方法引用给一个HashMap构造函数,这意味着一个HashMap实例将被创建。如果调用 4 参数toMap变体,则可以控制Map要返回的实现类型。

类似地,toList()返回 anArrayListtoSeta HashSet(至少在 Java 8 中),但在未来版本中可能会发生变化,因为它不是合同的一部分。