【问题标题】:Java Stream: combine elements in a mapJava Stream:在地图中组合元素
【发布时间】:2017-09-25 22:07:36
【问题描述】:

我有一个Map<String, List<class1> > dict,这就是我希望做的事情

Multiset<class1> dict1 = HashMutlset.create();
SetMultimap<class1, String> dict2 = HashMultimap.create();
for (Entry<String, List<class1>> entry : dict.entrySet()) {
   dict1.addAll(entry.getValue());
   for (class1 elem : entry.getValue()) {
       dict2.put(elem, entry.getKey());
   }
}

我希望将所有 class1 对象放在 Multiset 的列表中,并且还可以反向查找 class1 对象及其键。

有没有办法使用流编写等效代码?

【问题讨论】:

  • 那些是番石榴类吗??
  • 考虑无流替代方案:dict.forEach( (k,v) -&gt; { dict1.addAll(v); v.forEach( elem -&gt; dict2.put(elem, k) ); });

标签: java java-8 java-stream multiset


【解决方案1】:
ImmutableSetMultimap<class1, String> dict2 = dict.entrySet().stream()
   .collect(ImmutableSetMultimap.flatteningToImmutableSetMultimap(
      entry -> entry.getKey(),
      entry -> entry.getValue().stream()))
   .inverse();
ImmutableMultiset<class1> dict1 = dict2.keys();

一般来说,使用Stream.forEach 将事物放入集合中是一种反模式。

【讨论】:

  • 我想你的意思是ImmutableSetMultimap&lt;class1, String&gt;
  • 谢谢先生,经过深思熟虑,看到您的回答,我发现您的回答是做这件事的最佳方式。所以我删除了我的答案。并再次感谢您的反馈。再加上我的一个。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-28
  • 2012-05-20
  • 1970-01-01
相关资源
最近更新 更多