2017-02-14 17 views
10

forEach操作を使用せずにjava 8を使用してListMultiMapに収集しようとしています。Java 8ストリームを使用してGuavaのListMultiMapに収集する

私は、Java 7でコードを書くとしたら、それはこのようなものになります:私はオンラインなど、この1のようなシナリオで使用するために、独自のコレクターの作成について語っwebsiteを見つけ

ListMultimap<String, String> result = ArrayListMultimap.create(); 
    for(State state: states) { 
     for(City city: state.getCities()) { 
     result.put(state.getName(), city.getName()); 
     } 
    } 

。 私はこの実装をコレクターに使用しました。私は、次のコードを書いた:

 ListMultimap<String, String> result = states 
     .stream() 
     .flatMap(state -> state.getCities().stream() 
      .map(city -> { 
       return new Pair(state, city); 
      })) 
     .map(pair -> { 
      return new Pair(pair.first().getName(), pair.second().getName())); 
     }) 
     .collect(MultiMapCollectors.listMultimap(
        Pair::first, 
        Pair::second 
       ) 
     ); 

をしかしコレクトレベルでは、私はただ一つのパラメータを渡すことができますし、私は2つのパラメータを渡す方法を見つけるように見えることができます。 ウェブサイトからの例に続いて、私は両方を使用することを理解し、私は次のようなマルチマップで「ペア」を格納する必要があります。

ArrayListMultimap<String, Pair> testMap = testObjectList.stream().collect(MultiMapCollectors.listMultimap((Pair p) -> p.first().getName())); 

しかしこれは、私が探しているものを私ではありません州の名前と都市の名前を使用して、Java 8のコレクターを使用してListMultimapに収集したい(forEachはありません)。

誰かが私を助けることができますか? ありがとうございました!

+2

このリンクの背後にあるコードは見えません。生の型、チェックされていないキャスト、およびアキュムレータの不要な型変数。 –

+0

あなたは正しいです!それを指摘していただきありがとうございます! 似たような実装をしている他の多くのWebサイトが見つかったので、それは健全だと思いました。ありがとうございました ! – codastic

答えて

1

あなた(ルイ・ワッサーマンの答えは内部forEachOrderedないだろうことに注意してください、あなたが本当に内部または外部のforEachを免れることはできない)そのためのカスタムコレクタを作成することができます。

ListMultimap<String, String> list = states.collect(Collector.of(ArrayListMultimap::create, (multimap, s) -> { 
     multimap.putAll(s.getName(), s.getCities().stream().map(City::getName).collect(Collectors.toList())); 
    }, (multi1, multi2) -> { 
     multi1.putAll(multi2); 
     return multi1; 
    })); 
+0

ありがとうございます!私はLouis Wassermanの答えに似たものを探していましたが、 "あなたはカスタムコレクターを作ることができました"と言って何か別のものが必要だと思ってくれました。 – codastic

関連する問題