2017-09-29 11 views
1

いくつかのエンティティがあり、すべてのエンティティに検索可能なフィールドのリストとタイプがあります。異なる種類のエンティティごとにリスト内のフィールドをマッピングする方が良い(効率的な方法を読む)方が良いでしょうか。別のリストをストリーミング中にリストにデータを追加

現在、私がやっている何がある:

final Collection<IndexedField> indexedFields = new ArrayList<>(); 
for (String type : types) { 
    final Class<? extends IndexedEntity> targetClass = indexedEntities.getClassByType(type); 
    indexedFields.addAll(indexedEntities.getSearchFieldsFor(targetClass)); 
} 

これは動作しますが、これを達成するためにいくつかのより良い方法はありますか?おそらく、ストリームapiで何か。私が正しく理解している場合

+0

をあなたがあなたを言いますタイプ別にフィールドをマップしたいあなたのコードでは、単一のリストを使用しています。 Map >(Stringキーが型である)を使用するか、何をしようとしているのか分かりません。私たちはあなたを助けることができるようにこれを明確にすることができますか? – lbndev

+0

申し訳ありませんが、私が地図を教えたとき、私はストリームのAPIマップ機能に従っています。 – mirzak

答えて

3

にそれを短縮することができます:あなたはまた、唯一のメソッド参照使用して書くことができます

types.stream() 
    .map(indexedEntities::getClassByType) 
    .flatmap(x -> indexedEntities.getSearchFieldsFor(x).stream()) 
    .collect(Collectors.toList()); 
+0

これはまさに私が探していたものです。ありがとうございました。 – mirzak

0

あなたは

types.stream().<Class<? extends IndexedEntity>>map(
      type -> indexedEntities.getClassByType(type)).<Collection<? extends IndexedField>>map(
      targetClass -> indexedEntities.getSearchFieldsFor(targetClass)).forEach(indexedFields::addAll); 
+0

'forEach'を使って他のコレクションを設定することはお勧めしません。スレッドセーフではなく、 'collect'を使うほうが良いですか? –

0

:あなたの質問に

final Collection<IndexedField> indexedFields = types.stream() 
             .map(indexedEntities::getClassByType) 
             .map(indexedEntities::getSearchFieldsFor) 
             .flatMap(Collection::stream) 
             .collect(Collectors.toList()); 
関連する問題