Java 8 使用Collectors.toMap将ImmutableListMultimap转换为Map

Java 8 使用Collectors.toMap将ImmutableListMultimap转换为Map,java-8,java-stream,Java 8,Java Stream,我想将ImmutableListMultimap转换为Map。 我以前是用非流的方式做的,如下所示 void convertMultiMaptoList(ImmutableListMultimap<String, Character> reverseImmutableMultiMap) { Map<String, List<Character>> result = new TreeMap<>();

我想将
ImmutableListMultimap转换为Map
。 我以前是用非流的方式做的,如下所示

    void convertMultiMaptoList(ImmutableListMultimap<String, Character> reverseImmutableMultiMap) {
            Map<String, List<Character>> result = new TreeMap<>();
          for( Map.Entry<String, Character> entry: reverseImmutableMultiMap.entries()) {
              String key = entry.getKey();
              Character t = entry.getValue();
          result.computeIfAbsent(key, x-> new ArrayList<>()).add(t);
       }
       //reverseImmutableMultiMap.entries().stream().collect(Collectors.toMap)
}
void convertMultiMaptoList(ImmutableListMultimap reverseImmutableMultiMap){
映射结果=新树映射();
对于(Map.Entry:reverseImmutableMultiMap.entries()){
String key=entry.getKey();
字符t=entry.getValue();
computeIfAbsent(key,x->newArrayList()).add(t);
}
//reverseImmutableMultiMap.entries().stream().collect(Collectors.toMap)
}
我想知道如何使用java8流方式(Collectors.toMap)编写上述相同的逻辑

请分享您的想法

Map result=reverseImmutableMultiMap.entries().stream()
Map<String, List<Character>> result = reverseImmutableMultiMap.entries().stream()
    .collect(groupingBy(Entry::getKey, TreeMap::new, mapping(Entry::getValue, toList())));
.collect(groupingBy(Entry::getKey,TreeMap::new,mapping(Entry::getValue,toList()));
重要的细节是。它将转换收集器(
toList
),以便它收集
List
,而不是
List
。根据映射函数
Entry::getValue

将按
字符串对所有条目进行分组

将使用相同的键将所有值收集到列表中


另外,将
TreeMap::new
作为参数传递给
groupingBy
将确保您获得这种特定类型的
Map
,而不是默认的
HashMap

那么已经有了一个
asMap
,您可以使用它来简化:

    Builder<String, Character> builder = ImmutableListMultimap.builder();
    builder.put("12", 'c');
    builder.put("12", 'c');

    ImmutableListMultimap<String, Character> map = builder.build();

    Map<String, List<Character>> map2 = map.asMap()
            .entrySet()
            .stream()
            .collect(Collectors.toMap(Entry::getKey, e -> new ArrayList<>(e.getValue())));

谢谢你的回答和详细的解释。现在我的疑问是,哪个更容易阅读?流版本还是非流版本?对我来说,流版本看起来更可读,但可能比非流版本做更多的工作。看起来我必须做一个性能度量。这种情况下的可读性取决于对基于流的代码的熟悉程度。一旦熟悉了语法并避免了嵌套流,它们就更具可读性,也不容易出错。例如,在您的原始代码中,我对这一行
result.computeIfAbsent(key,x->new ArrayList())感到困惑。添加(t)
几秒钟。就性能而言,我不希望有太大的差异,尤其是对于大型集合。一旦花掉了设置流、收集器、映射器所需的少量前期成本,在每一次迭代中基本上都是相同的工作。但在这种情况下,一定要衡量它是否重要!
 ImmutableMap<String, Collection<Character>> asMap =  map.asMap();