我认为您的备选方案2和3可以重写为更清楚:
备选方案2 :
Map<String, Customer> res2 = customers.stream() .flatMap( c -> Stream.of(c.first, c.last) .map(k -> new AbstractMap.SimpleImmutableEntry<>(k, c)) ).collect(toMap(Map.Entry::getKey, Map.Entry::getValue));
备选方案3 :
reduce通过更改HashMap来滥用代码。要进行可变还原,请使用
collect:
Map<String, Customer> res3 = customers.stream() .collect( HashMap::new, (m,c) -> {m.put(c.first, c); m.put(c.last, c);}, HashMap::putAll );请注意,这些不相同。如果键重复,则选项2将引发异常,而选项3将静默覆盖条目。
如果您想要在重复键的情况下覆盖条目,我个人更喜欢替代方案3。它与迭代解决方案最相似。我希望它的性能更高,因为备选方案2必须在所有扁平化的情况下为每位客户分配大量资金。
但是,通过将条目的产生与聚合分开,替代方案2与替代方案3相比具有巨大优势。这给您很大的灵活性。例如,如果要更改替代方法2以覆盖重复键上的条目而不是引发异常,则只需将添加
(a,b)->b到即可
toMap(...)。如果你决定要收集匹配条目到列表中,您所要做的就是更换
toMap(...)用
groupingBy(...)等。



