2017-11-24 1 views
2

Ich mag nicht Abschnitt mit ForEach, aber ich würde nicht wissen, wie man das besser mit Lambda tut.Wie kann ich das mit Lambda besser machen?

list1.stream().map(element -> { 
    list2.forEach(item -> { 
     if (element.getKey().equals(item.getKeyNextYear())) { 
      element.setSummPreviosYear(item.getSumm()); 
      element.setCashboxCountPreviosYear(item.getCashboxCount()); 
      element.setCheckCountPreviosYear(item.getCheckCount()); 
      element.setArticleCountPreviosYear(item.getArticleCount()); 
     } 
    }); 
    return element; 
}).collect(Collectors.toList()); 
+5

Sie missbrauchen den Kartenoperator hier sehr, und das Sammeln zu einer neuen Liste scheint völlig nutzlos. Gibt es höchstens einen Eintrag in list2 mit einem gegebenen SchlüsselNextYear? Weil Ihr Code O (M * N) ist und wahrscheinlich O (M + N) sein könnte. Wenn es mehrere solche Elemente gibt und Sie das Element wirklich mit dem letzten aktualisieren möchten, sollten Sie rückwärts iterieren und die innere Schleife stoppen, sobald Sie das Element gefunden haben. –

Antwort

6

Sie viel kann dies vereinfachen zu bewegen indem Sie den äußeren Strom entfernen und den inneren Teil mit einer filter().findAny() Suche machen. Dies verhindert auch das erneute Festlegen der Eigenschaften für den Fall, dass mehrere Elemente in list2 mit dem Element übereinstimmen.

list1.forEach(element -> 
       list2.stream() 
        .filter(item -> element.getKey().equals(item.getKeyNextYear())) 
        .findAny() 
        .ifPresent(item -> { 
         element.setSummPreviosYear(item.getSumm()); 
         element.setCashboxCountPreviosYear(item.getCashboxCount()); 
         element.setCheckCountPreviosYear(item.getCheckCount()); 
         element.setArticleCountPreviosYear(item.getArticleCount()); 
        })); 

Es gibt keine Notwendigkeit zu streamen list1 und in eine neue Liste zu sammeln, zumindest nicht klar von Ihrem Beispielcode ist. Die ursprüngliche Liste enthält immer noch die gleichen Elemente wie die neue, einschließlich der geänderten Eigenschaften.

+2

Wenn mehrere Elemente mit demselben SchlüsselNextYear vorhanden sind, entspricht dies nicht dem veröffentlichten Code. –

+1

Ich denke, die Argumentation hier ist, dass "Schlüssel" ist ein Schlüssel in einer Karte und damit einzigartig, aber _if_ das ist der Fall (groß, wenn) dann Schleifen und Filtern ist der falsche Ansatz zu beginnen. –

+0

@ JBNizet True, aber der erste Code hat das auch nicht berücksichtigt. Es rief nur die Setter immer wieder an. –

2

entfernen ‚if‘ - Anweisung Sie filter zuerst verwenden:

list2.filter(item -> element.getKey().equals(item.getKeyNextYear())).forEach(...) 

Und ich denke, es ist besser Setter neue Methode