7

次のオブジェクトがあります。

public class Item {
    String value;
    List<Person> owners;
    Person creator;
}

public class Person {
    String name;
    int id;
    Person manager;
}

今、私は3つのアイテムオブジェクトを含むリストを持っています:

i1 -> {value="1", owners=[p1, p2, p3], creator=p4}
i2 -> {value="2", owners=[p2, p3], creator=p5}
i3 -> {value="3", owners=[p5], creator=p1}

Person オブジェクトは次のとおりです。

p1 -> {manager=m1, ...}
p2 -> {manager=m2, ...}
p3 -> {manager=m3, ...}
p4 -> {manager=m2, ...}
p5 -> {manager=m1, ...}

所有者と作成者の管理者に基づいて、Item オブジェクトのストリームをグループ化したい。結果Map<Person, List<Item>>は次のようになります。

{
  m1: [i1, i2, i3],
  m2: [i1, i2],
  m3: [i1, i2]
}

Stream API と Collector API を使用すると、最初に Item から manager へのマップを作成しMap<Item, List<Person>>、次にマッピングを逆にすることができると思います。しかし、ストリームとコレクターのみを使用して必要なマッピングを作成する方法はありますか?

4

2 に答える 2

21

これは、個人/マネージャーと元のアイテムとの間の関連付けを記憶する中間の「ペア」値でのみ可能であると思います。Java の標準 API に標準のペア型がないため、型Map.Entryに最も近いものを使用する必要があります。Pair

Map<Person, List<Item>> map = list.stream()
  .flatMap(item->item.getOwners().stream()
    .map(p->new AbstractMap.SimpleEntry<>(p.getManager(), item)))
  .collect(Collectors.groupingBy(Map.Entry::getKey,
    Collectors.mapping(Map.Entry::getValue, Collectors.toList())));

import staticを使用してそれを改善した後、

Map<Person, List<Item>> map = list.stream()
  .flatMap(item->item.getOwners().stream().map(p->new SimpleEntry<>(p.getManager(), item)))
  .collect(groupingBy(Map.Entry::getKey, mapping(Map.Entry::getValue, toList())));

その結果、

m1: [i1,i3]
m3: [i1,i2]
m2: [i1,i2]

まず、標準マップには順序が定義されていないため、次のように異なります。次に、例のデータにm1関連付けられていないため、期待に関して間違いを犯したと思います。i2

于 2015-10-12T18:06:09.713 に答える
4

このようなシナリオは、標準の Stream API を拡張する無料のStreamExライブラリによって十分にサポートされています。

Map<Person, List<Item>> map = StreamEx.of(list) // create an enhanced stream of Item
                // create a stream of Entry<Item, manager>
                .cross(item -> item.getOwners().stream().map(Person::getManager))
                // swap keys and values to get stream of Entry<manager, Item>
                .invert()
                .grouping();

内部的には @Holger ソリューションに似ています。

于 2015-10-12T21:49:54.707 に答える