使用Java 8 Stream API展平地图并关联值

时间:2015-11-17 02:11:33

标签: lambda functional-programming java-8 java-stream flatmap

假设我有一组字符串到整数值的映射:
Map<HashSet<String>, Integer> map = new HashMap<>()

例如,map是(我们假设没有重复的字符串):

{x,y}   ->  2
{z}     ->  3
{u,v,w} ->  4

如何使用 Java 8 Stream API 获取another_map类型Map<String, Integer>,如下所示:

x -> 2
y -> 2
z -> 3
u -> 4
v -> 4
w -> 4

它看起来像flatMap操作,但是如何将Integer值与每个String键相关联?

1 个答案:

答案 0 :(得分:7)

您可以这样创建中间alias :image, :headerimage def headerimage(name=nil) headerimage(name || :thumb) end 对象:

Map.Entry

或者,您可以使用项目中的任何其他对/元组类型。

请注意,我的免费StreamEx库支持以更干净的方式处理此类案例(内部与上述相同):

Map<String, Integer> result = map.entrySet().stream()
   .<Entry<String, Integer>>flatMap(entry -> 
       entry.getKey()
            .stream()
            .map(s -> new AbstractMap.SimpleImmutableEntry<>(s, entry.getValue())))
   .collect(Collectors.toMap(Entry::getKey, Entry::getValue));

EntryStream课程延伸Map<String, Integer> result = EntryStream.of(map).flatMapKeys(Set::stream).toMap(); ,并提供其他有用的方法,例如flatMapKeystoMap