使用流,如何映射哈希映射中的值?

2022-09-01 00:55:20

给定一个 Person 有一个(etc)方法的地方,我怎么能把 the 变成一个从调用中获得的方法?Map<String, Person>String getName()Map<String, Person>Map<String, String>StringPerson::getName()

Java 8之前我会用

Map<String, String> byNameMap = new HashMap<>();

for (Map.Entry<String, Person> person : people.entrySet()) {
    byNameMap.put(person.getKey(), person.getValue().getName());
}

但我想使用流和lambda来做到这一点。

我看不出如何在函数式风格中做到这一点:Map/HashMap不实现Stream

people.entrySet()返回一个我可以流式传输的内容,但是如何向目标地图添加新地图?Set<Entry<String, Person>>Entry<String, String>


答案 1

使用Java 8,您可以执行以下操作:

Map<String, String> byNameMap = new HashMap<>();
people.forEach((k, v) -> byNameMap.put(k, v.getName());

虽然你最好使用Guava的Maps.transformValues,它会包装原件并在你做时进行转换,这意味着你只需要在实际消费价值时支付转换成本。Mapget

使用番石榴看起来像这样:

Map<String, String> byNameMap = Maps.transformValues(people, Person::getName);

编辑:

根据@Eelco的评论(以及完整性),最好使用Collectors.toMap转换为地图,如下所示:

Map<String, String> byNameMap = people.entrySet()
  .stream()
  .collect(Collectors.toMap(Map.Entry::getKey, (entry) -> entry.getValue().getName());

答案 2

一种方法是使用收集器:toMap

import static java.util.stream.Collectors.toMap;

Map<String, String> byNameMap = people.entrySet().stream()
                                     .collect(toMap(Entry::getKey, 
                                                    e -> e.getValue().getName()));

推荐