hen*_*xin 4 lambda functional-programming java-8 java-stream flatmap
假设我有一组字符串到整数值的映射:
Map<HashSet<String>, Integer> map = new HashMap<>().
例如,mapis(我们假设没有重复的字符串):
{x,y}   ->  2
{z}     ->  3
{u,v,w} ->  4
Run Code Online (Sandbox Code Playgroud)
如何使用Java 8 Stream API获取如下another_map类型:Map<String, Integer>
x -> 2
y -> 2
z -> 3
u -> 4
v -> 4
w -> 4
Run Code Online (Sandbox Code Playgroud)
它看起来像一个flatMap操作,但是如何将Integer值与每个String键相关联?
你可以这样创建这样的中间Map.Entry对象:
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));
Run Code Online (Sandbox Code Playgroud)
或者,您可以使用项目中的任何其他对/元组类型.
请注意,我的免费StreamEx库支持以更干净的方式处理此类情况(内部与上面相同):
Map<String, Integer> result = EntryStream.of(map).flatMapKeys(Set::stream).toMap();
Run Code Online (Sandbox Code Playgroud)
在EntryStream类扩展Stream<Map.Entry>,并提供额外的有用的方法,如flatMapKeys或toMap.
|   归档时间:  |  
           
  |  
        
|   查看次数:  |  
           1051 次  |  
        
|   最近记录:  |