2016-07-01 12 views
2

Ich bin immer noch neu in Java 8 Streams, so dass ich herausfinden, wie es am einfachsten zu tun ist.Java 8 Stream kombinieren zwei verschiedene Sammlungen

Ich würde gerne wissen, ob es eine einfachere Lösung für die Kombination von zwei Streams von verschiedenen Objekten gibt.

Sagen wir, ich habe folgende Java-Objekte.

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 
} 

und mit der folgenden Methode abrufen ich alle Nachrichten mit ihren Lokalisierungen.

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())); 
          }); 
       }); 
} 

hier So habe ich in zwei Schritten:

  1. Daten aus dem Repository abrufen und Konstruieren Message Liste
  2. Streaming Message Liste und Daten aus anderen Repository für seine Lokalisierungen

Abrufen von Can das wird irgendwie einfacher umgeschrieben (zum Beispiel den zweiten Schritt in der ersten)?

Dank

+1

Hinweis: Sie fragen im Grunde nach der Verbesserung bestehender, funktionierender Code. Das könnte auch gehen codereview.stackexchange.com – GhostCat

Antwort

1

Betrachten Sie die Initialisierung der localizations Liste als Teil der Initialisierung des Message Objekts:

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()); 
} 

Dies führt natürlich zu dem Schluss, dass der Code noch einfacher sein könnte, wenn der Message Konstruktor akzeptieren würde eine Liste von Lokalisierungen ...

+0

Die 'Message' Konstruktor Empfehlung würde es viel einfacher machen +1 – explv

+0

Das ist sehr nett. @arizzle was meinst du mit Message constructor recommendation? – bilak

+0

Wenn in Message zwei Arrays vorhanden sind (z. B. Liste ), besteht die Möglichkeit, jede Sammlung parallel zu bearbeiten? Ich meine Liste und Liste paralell. – bilak

0

Danke an @Holger Ich bin mit dieser Konstruktion fertig (vielleicht wird das für jemanden in der Zukunft nützlich sein)

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());