Java Stream API : what kind of map method collect(Collectors. toMap()) 返回?

标签 java java-stream collectors

“hm”是什么 map ?

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

是否依赖声明?

Map<String,Person> hm = new HashMap<>();
Map<String,Person> hm = new TreeMap<>();

最佳答案

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

实际返回的Map 实现是一个实现细节。目前它默认返回一个 HashMap,但您可以使用 toMap() 的不同变体请求特定的 Map 实现。

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

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

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

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

关于Java Stream API : what kind of map method collect(Collectors. toMap()) 返回?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56751993/

相关文章:

java - 自定义 map 收集器

java - 当 View 被限制为卡片 View 时,如何修复 View 不离开页面

参数化类的java流返回数组

java - 使用 Streams 将 PriorityQueue 转换为 Map

java - 现代 Java 实践中有关 java 流 dropWhile 示例的问题

java - 如何使用 Java 8 收集器对三重嵌套映射求和

Java API Streams 在 Map 中收集流,其中值为 TreeSet

java - 使用集合查询 @Entity 中的 @ElementCollection

java - JPA:QueryCriteria where 子句中的谓词和表达式

java - Android ImageDownloader类: sHardBitmapCache NOT static when it should be?可能存在BUG