【问题标题】:Java Stream API : what kind of map method collect(Collectors.toMap()) returns?Java Stream API:collect(Collectors.toMap()) 返回什么样的地图方法?
【发布时间】:2019-06-25 10:30:32
【问题描述】:

“hm”是什么地图?

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

【问题讨论】:

  • A Mapergo 不是 ListSet
  • 问题已更正

标签: java java-stream collectors


【解决方案1】:

不,初始化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 中),但这在未来的版本中可能会改变,因为它不是合同的一部分。

【讨论】:

  • 有趣的是,the documentation of toList() 包含明确的声明:“不保证返回的 List 的类型、可变性、可序列化性或线程安全性”,同样有 @ 987654340@,但是对于toMap(…)已经被遗忘了……The most recent version有这样的说法。
猜你喜欢
  • 2014-09-30
  • 1970-01-01
  • 1970-01-01
  • 2012-06-13
  • 1970-01-01
  • 1970-01-01
  • 2013-02-10
  • 2019-10-12
  • 1970-01-01
相关资源
最近更新 更多