Foo
のリストと、2つの重要なプロパティBar bar
とBaz 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);
}
}
私自身の機能的なチョップは、その仕事には立証されていません。私はreduce
とcollect
の両方のリストを試みましたが、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は、アキュムレータが要素と異なる値になることを許可しないため、機能しません。
'collect'または' reduce'試行のいくつかを表示してください。 – Flown
Guavaの[SetMultimap](https://github.com/google/guava/wiki/NewCollectionTypesExplained#multimap)が適切かもしれません。これは 'put(foo.bar、foo.baz)'で行うことができます。 –