Jestem nowy w wyrażeniach lambda i próbuję ich użyć do zredukowania następującego kodu do odpowiednika lambda. Spojrzałem na zmniejszenie i flatMap i forEach, a także kilka innych rzeczy, ale oczywiście brakuje czegoś, ponieważ wszystko, co próbuję, jest albo niepoprawne syntaktycznie, albo nie mam odniesienia do tego, czego potrzebuję.Wyrażenie Java Lambda dla zagnieżdżonych pętli z warunkowym
Potrzebuję wykonać analizę każdego elementu względem wszystkich innych elementów w kolekcji. Zakodowałem to jako pętle zagnieżdżone warunkowe. Po zidentyfikowaniu niezgodnych elementów obliczenia są wykonywane przy użyciu obu elementów. Wreszcie, chcę zbiór wyników dla każdego obliczenia porównawczego.
Więc oto oryginalny kod:
final List<Element> updated = new ArrayList<>(elements.size());
for (final Element first : elements) {
Attribute newAttribute = first.getAttribute();
for (final Element second : elements) {
if (!first.equals(second)) {
newAttribute = newAttribute.add(computeChange(first, second));
}
}
final Element newElement = new Element(first.getEntry(), newAttribute, first.getValue());
updated.add(newElement);
}
Następnie próbowałem wiele odmian wyrażeń lambda, z których najprostsza jest:
elements.parallelStream()
.map(first -> new Element(first.getEntry(), first.getAttribute().add(
computeChange(first, second)), first
.getValue())).collect(Collectors.toList()));
Oczywiście, to jest źle, jak tam nie ma odniesienie do drugiego dostępnego mi i bez warunku/filtra dla drugiego nie będącego równym pierwszemu.
Jak zmniejszyć tę zagnieżdżoną pętlę warunkowym zwracaniem kolekcji do wyrażenia lambda?
Każda pomoc tutaj jest bardzo doceniana.
Jest to trudne, ponieważ Twój 'newAttribute = newAttribute.add (...)' aktualizacje nie są parallelizable. Byłoby łatwiej, gdybyś mógł zebrać wszystkie wyniki "computeChange", a następnie utworzyć atrybut "Attribute" (lub "Element") z tego agregatu. –
Po prostu zostawiłbym taki, jaki jest. –
Co zwróci 'computeChange'? "Element", "Atrybut" lub liczba? –