给定一个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所描述 的类型安全的异构容器类似,只是您不能使用来强制转换结果