当前位置: 首页 > 面试题库 >

使用流,如何在HashMap中映射值?

申屠昆
2023-03-14
问题内容

给定一个Map<String, Person>Person上具有String getName()(etc)方法Map<String, Person>Map<String, String>where,我该如何将其转换String为通过调用获得的where
Person::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>向目的地地图添加新的内容?


问题答案:

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

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

尽管使用Guava的Maps.transformValues会更好,它会包裹原始文件Map并在执行时进行转换get,这意味着您仅在实际消耗该值时才支付转换成本。

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

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


 类似资料:
  • 我看不出如何在函数式中做到这一点:map/hashmap不实现。 返回一个,我可以对其进行流式传输,但如何将新的添加到目标映射?

  • 我正在寻找第一次到流API的Java8。我尝试创建一个筛选器来从映射中删除元素。

  • 我想要一个流的等价物: 这段代码实际上并不编译,因为0不能分配给类型T,但您明白了。

  • 我有一张地图 我想从键列表中获取值,如拥有键列表,即键名称列表。 我知道一个方法 但是,我想将此列表本身传递到流API中,而不是循环,这将过滤匹配的值和返回列表。这是可能的! !提前致谢。

  • 我有这些学生物品清单, 我想从这些学生列表对象生成哈希图。 hashmap包含sudentid和name list键值对。

  • 问题内容: 我想创建一个。基本上,我想使用一种说明该类型的方法来映射一个类型。 我希望能够动态地说出对象X,执行Y。我可以 但它很烂,因为然后我必须在使用它时将对象投射到兰巴中。 例: 我想做的是 但这似乎是不允许的。有没有办法做到这一点 ?使用此类型的方法映射类型的最佳解决方法是什么? 问题答案: 本质上,这与Joshua Bloch所描述 的类型安全的异构容器类似,只是您不能使用来强制转换结果