2016-07-01 4 views
2

私はまだJava 8ストリームには新しく、できるだけシンプルにする方法を考えています。Java 8ストリームは2つの異なるコレクションを結合します

異なるオブジェクトの2つのストリームを結合するためのより簡単なソリューションがあるかどうかを知りたいと思います。

次のようなjavaオブジェクトがあるとします。

public class Message { 

    private String id; 
    private String key; 
    private List<MessageLocalization> localizations = new ArrayList<>(); 

    // ...getters setters 
} 

public class MessageLocalization { 

    private String id; 
    private String language; 
    private String baseText; 
    private String shortText; 
    private String longText; 
    private Integer orderBy = 1; 

    // ...getters setters 
} 

以下のメソッドを使用して、ローカライズされたすべてのメッセージを取得しています。

public List<Message> getAllMessages() { 
     List<Message> messages = 
       StreamSupport 
         .stream(messageRepository.findAll().spliterator(), false) 
         .map(message -> new Message(message.getId(), message.getMessageKey())) 
         .collect(Collectors.toList()); 

     messages 
       .stream() 
       .forEach(message -> { 
        localizationRepository.findAllByObjectIdAndLocalizedType(message.getId(), LocalizedType.MESSAGE) 
          .stream() 
          .forEach(localization -> { 
           message.getLocalizations().add(
             new MessageLocalization(localization.getId(), 
               localization.getLanguage(), 
               localization.getBaseText(), 
               localization.getShortText(), 
               localization.getLongText(), 
               localization.getOrderBy())); 
          }); 
       }); 
} 

だからここに私は2つのステップがあります。

  1. リポジトリからデータを取得し、Messageリストを構築
  2. Messageリストをストリーミングし、そのローカライズのために、他のリポジトリからデータを取得

できますこれは何とか簡単に書き直すことができます(たとえば、最初のステップに2番目のステップが含まれます)。

おかげ

+1

ヒント:基本的には、既存の作業コードの改善について質問しています。それはまたcodereview.stackexchange.com – GhostCat

答えて

1

Message、オブジェクトの初期化の一部としてlocalizationsリストの初期化を考えてみましょう:

public List<Message> getAllMessages() { 
    return StreamSupport.stream(messageRepository.findAll().spliterator(), false) 
     .map(message -> { 
      Message newMessage = new Message(message.getId(), message.getMessageKey()); 
      localizationRepository.findAllByObjectIdAndLocalizedType(message.getId(), LocalizedType.MESSAGE) 
       .forEach(localization -> { 
        newMessage.getLocalizations().add(
         new MessageLocalization(localization.getId(), 
          localization.getLanguage(), 
          localization.getBaseText(), 
          localization.getShortText(), 
          localization.getLongText(), 
          localization.getOrderBy())); 
      }); 
      return newMessage; 
     }) 
     .collect(Collectors.toList()); 
} 

これは当然Messageコンストラクタが受け入れるならば、コードはさらに簡単かもしれないという結論につながりますローカリゼーションのリスト...

+0

に行くことができます。 'Message'コンストラクタの推奨はそれをもっと簡単にします+1 – explv

+0

それはとてもいいです。 @arizzle Messageコンストラクタの推奨はどういう意味ですか? – bilak

+0

Messageに2つの配列(例えばList )がある場合、各コレクションのパラレル処理が可能ですか?私はリストとリストパラレルを意味します。 – bilak

0

@Holgerのおかげで、私はこの構築を完了しました(これは将来的に誰かにとって役に立ちます)

List<Message> messages = StreamSupport.stream(messageRepository.findAll().spliterator(), false) 
       .map(message -> new Message(message.getId(), 
         message.getMessageKey(), 
         // list localizations 
         StreamSupport 
           .stream(localizationRepository.findAllByObjectIdAndLocalizedType(message.getId(), LocalizedType.MESSAGE).spliterator(), 
             false) 
           .map(localization -> new MessageLocalization(localization.getId(), 
             localization.getLanguage(), 
             localization.getBaseText(), 
             localization.getShortText(), 
             localization.getLongText(), 
             localization.getOrderBy())) 
           .collect(Collectors.toList()), 
         // list categories 
         StreamSupport.stream(messageCategoryRepository.findAllByMessageId(message.getId()).spliterator(), false) 
           .map(msgCategory -> new MessageCategory(msgCategory.getId(), msgCategory.getMessageId(), msgCategory.getCategoryId())) 
           .collect(Collectors.toList()) 

       )).collect(Collectors.toList()); 
関連する問題