bugfix> java-8 > 投稿

2つの文字列を含む配列のリストがあります。

List<String[]> pets = {["Alice", "dog"], ["Bob", "horse"], ["Alice", "cat"], ["Bob", "cat"]}

次のように、それらを文字列から文字列のリストへのマップに変換したい:

Map<String, List<String>>> pets = Map where
"Alice" maps to the List {"dog, "cat"}
"Bob" maps to the List {"horse", "cat"}

つまり、配列の最初の要素を取得し、最初の要素が互いに等しいすべての要素をグループ化します。これを解決するための必須の方法は、要素をループし、徐々にマップを構築することです。 java Streamsでこれを行う方法、つまりCollectorまたはreduceを使用する方法はありますか?

回答 1 件
  • もちろんできます!

    マップキーとなる各配列の最初の要素でグループ化し、マッピングコレクターを適用して対応する値を取得できます。

    Map<String, List<String>> resultSet = pets.stream()
                    .collect(groupingBy(array -> array[0],
                            collectingAndThen(mapping(e -> Arrays.copyOfRange(e, 1, e.length),
                                    toList()),
                                    f -> f.stream().flatMap(Arrays::stream)
                                    .collect(toList()))));
    
    

    または:

    Map<String, List<String>> resultSet = pets.stream()
                    .collect(groupingBy(array -> array[0],
                    flatMapping(e -> Arrays.stream(Arrays.copyOfRange(e, 1, e.length)),
                                        toList())));
    
    

    注、このソリューションは flatMapping を使用します  JDK-9以降でのみ利用可能なコレクタ。

あなたの答え