web-dev-qa-db-ja.com

Collectors.toMap()とCollectors.groupingBy()の違いにより、マップに収集されます

MapsのListからPointを作成し、マップ内にMap<Long, List<Point>>などの同じparentIdでマップされたリストのすべてのエントリが必要です。
Collectors.toMap()を使用しましたが、コンパイルしません:

Map<Long, List<Point>> pointByParentId = chargePoints.stream()
    .collect(Collectors.toMap(Point::getParentId, c -> c));
20
Tim Schwalbe

Collectors.groupingByはまさにあなたが望むもので、入力コレクションからMapを作成し、そのキーに指定したFunctionを使用してエントリを作成し、値として関連するキーを持つポイントのリストを作成します。

Map<Long, List<Point>> pointByParentId = chargePoints.stream()
    .collect(Collectors.groupingBy(Point::getParentId));
4
Patrick

次のコードがその処理を行います。 Collectors.toList()はデフォルトなので、スキップすることができますが、Map<Long, Set<Point>>Collectors.toSet()が必要な場合は必要になります。

Map<Long, List<Point>> map = pointList.stream()
                .collect(Collectors.groupingBy(Point::getParentId, Collectors.toList()));
4
xenteros

Object.fieldからこのフィールドを共有するオブジェクトのコレクションへのマップは、Multimapに保存する方が適切であることがよくあります(Guavaには、multimapのNice実装があります)。マルチマップを変更可能にする必要がない場合(望ましい場合)、次を使用できます。

Multimaps.index(chargePoints, Point::getParentId);

可変マップを使用する必要がある場合は、コレクターを実装できます(ここに示すように https://blog.jayway.com/2014/09/29/Java-8-collector-for-gauvas-linkedhashmultimap / )またはforループ(またはforEach)を使用して、空の可変マルチマップを作成します。

マルチマップは、フィールドからフィールドを共有するオブジェクトのコレクションへのマップを使用するときに通常必要となる追加機能を提供します(オブジェクトの総数など)。

可変マルチマップを使用すると、(Edgeのケースに関係なく)マップへの要素の追加と削除も簡単になります。

0
Roy Shahaf