2016-11-24 7 views
0

Ich möchte Stream s verwenden, die folgendes zu erreichen:Wie konvertiert man eine Liste eines Typs in eine Liste eines anderen Typs mit Streams?

Ich habe Liste der Input und Output Objekte eine völlig andere Struktur aufweist.

for-Schleife a Mit ich eine List<Input> zu einem List<Output> verwandeln kann wie folgt dar:

for (Input input : listOfInput) { 
    Output currentOutPutInstance = new Output(); 
    currentOutPutInstance.setArg1(input.getArg2()); 
    currentOutPutInstance.setArg2(input.getArg7()); 
    listOfOutPuts.add(currentOutPutInstance); 
} 

Mit Strömen habe ich versucht, so etwas wie dieses:

private List<Output> getOutPutListFromInputList(List<Input> inPutList) { 
    List<Output> outPutList = new ArrayList<Output>(); 
    outPutList = listOfPoolsInRun.stream.filter(<Somehow converting the input into output>) 
           .collect(Collectors.toList()); 
} 

Hinweis: bin ich nicht sicher, ob die Stream Methode sollte ich verwenden. Ich habe filter nur verwendet, um Dummy-Code anzuzeigen.

+1

warum 'fillter'? – Mritunjay

+0

@Mritunjay: es war nur ein Beispiel, ich bin mir nicht sicher, was ich hier verwenden kann – Roxy

Antwort

6

Verwenden map() ein Stream<Input> auf eine Stream<Output> zu verwandeln:

private List<Output> getOutPutListFromInputList(List<Input> inPutList) 
{ 
    return listOfPoolsInRun.stream() 
          .map(input -> { 
           Output out = new Output(); 
           out.setArg1(input.getArg2()); 
           out.setArg2(input.getArg7()); 
           return out; 
          }) 
          .collect(Collectors.toList()); 
} 

Dies verkürzt werden könnte, wenn Sie den entsprechenden Konstruktor in der Output Klasse:

private List<Output> getOutPutListFromInputList(List<Input> inPutList) 
{ 
    return listOfPoolsInRun.stream() 
          .map(input -> new Output(input.getArg2(),input.getArg7())) 
          .collect(Collectors.toList()); 
} 
+0

Der Vollständigkeit halber, da eine Eingabe verarbeitet werden muss, um eine Ausgabe zu bekommen, kann es sogar kürzer sein zu: zurück listOfPoolsInRun.stream(). map (this :: processInputs) .collect (Collectors.toList()); – Kree

+0

Oder, abhängig von der Situation und dem Geschmack, wenn Output weiß, wie man sich von der Eingabe instanziiert, könnte es eine statische Factory-Methode bereitstellen, so dass man 'map (Output :: fromInput)' schreiben könnte –

4

diesen Teil des Codes Stellen eine Methode:

OutPut createOutput(Input input) { 
    OutPut currentOutPutInstance=new Output(); 
    currentOutPutInstance.setArg1(input.getArg2()); 
    currentOutPutInstance.setArg2(input.getArg7()); 
    return currentOutPutInstance; 
} 

Dann einfach map darüber wie folgt aus:

outPutList = listOfPoolsInRun.stream().map(this::createOutput).collect(Collectors.toList()); 

Während createOutput ein spezielles Verfahren mit nicht notwendig ist, finde ich einen solchen Code besser lesbar.

Verwandte Themen