2017-07-03 8 views
1

Fooのリストと、2つの重要なプロパティBar barBaz bazがあります。インスタンスはBarの値を共有できますが、一意のBazがあります。リストを共有値のマップをユニーク値のリストに変換する

このリストをマップに変換して、を共有するすべてのインスタンスの一意のBazが、その共有Barにマップされたセットに入れられるようにしたいとします。

Map<Bar, Set<Baz>> m = new HashMap<>(); 
for (Foo foo : fooRepository.findAll()) { 
    if (m.containsKey(foo.bar)) { 
     m.get(foo.bar).add(foo.baz); 
    } else { 
     Set<Baz> set = new HashSet<>(); 
     set.add(foo.baz); 
     m.put(foo.bar, set); 
    } 
} 

私自身の機能的なチョップは、その仕事には立証されていません。私はreducecollectの両方のリストを試みましたが、lambdasとしてさまざまなパラメータを実装しようとするとタイプの問題が発生しました。

m = fooRepository.findAll().stream().collect(new HashMap<Bar, Set<Baz>>(), (m, foo)->m.merge(Foo::getBaz, s->s.add(foo.getBar())); 

が不完全収集用い

試みは、コンパイラは、MまたはfooとはFoo :: getBazのタイプを決定することができません。

Reduceは、アキュムレータが要素と異なる値になることを許可しないため、機能しません。

+1

'collect'または' reduce'試行のいくつかを表示してください。 – Flown

+0

Guavaの[SetMultimap](https://github.com/google/guava/wiki/NewCollectionTypesExplained#multimap)が適切かもしれません。これは 'put(foo.bar、foo.baz)'で行うことができます。 –

答えて

7
Map<Bar, Set<Baz>> m = fooRepository.findAll() 
     .stream() 
     .collect(Collectors.groupingBy(Foo::getBar, 
       Collectors.mapping(Foo::getBaz, Collectors.toSet()))); 
+0

互換性のない型:推論変数Rに互換性のない境界があります 等価制約:java.util.Map > 上限:java.util.HashMap >、java.lang.Object ストリームが最も基本的でない可能性があるので、これらの難解なエラーにどのくらいの頻度で遭遇するのが残念です。 – ThisIsNoZaku

+0

@ThisIsNoZaku私にとってうまくいく:http://ideone.com/BgO2pQ。あなたは 'HashMap'にキャストしようとしていますか? – shmosel

+0

Doh、フィールドはMapの代わりにHashMapとして実際に型指定されました!愚かなレガシーコード、私は確認することを忘れました。ありがとう! – ThisIsNoZaku

1

あなたがEclipse CollectionsからCollectors2.toSetMultimapを使用することができる代わりに、MapMultimapをたい場合。

SetMultimap<Bar, Baz> multimap = fooRepository.findAll() 
    .stream() 
    .collect(Collectors2.toSetMultimap(Foo::getBar, Foo::getBaz)); 

注:私はEclipse Collectionsのコミッターです。

+0

またはGuavaの['ImmutableSetMultimap.toImmutableSetMultimap()']](https://google.github.io/guava/releases/snapshot/api/docs/com/google/common/collect/ImmutableSetMultimap.html#toImmutableSetMultimap-java.util .function.Function - java.util.function.Function-) – shmosel

関連する問題