Ich bin neu zu Lambda-Ausdrücke und versuche, sie zu verwenden, um den folgenden Code auf das Lambda-Äquivalent zu reduzieren. Ich habe reduce und flatMap und forEach sowie einige andere Dinge untersucht, aber mir fehlt offensichtlich etwas, weil alles, was ich versuche, entweder syntaktisch falsch ist oder ich keine Referenz für das habe, was ich brauche.Java-Lambda-Ausdruck für verschachtelte Schleifen mit bedingten
Ich muss eine Analyse jedes Elements für alle anderen Elemente in einer Sammlung durchführen. Ich habe das als verschachtelte Schleifen mit einer Bedingung codiert. Sobald nicht übereinstimmende Elemente identifiziert wurden, wird eine Berechnung unter Verwendung beider Elemente durchgeführt. Schließlich möchte ich eine Sammlung von Ergebnissen für jede Vergleichsberechnung.
So, hier ist der ursprüngliche Code:
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);
}
Dann habe ich viele Variationen von Lambda-Ausdrücke versucht, von denen die einfachste ist:
elements.parallelStream()
.map(first -> new Element(first.getEntry(), first.getAttribute().add(
computeChange(first, second)), first
.getValue())).collect(Collectors.toList()));
Offensichtlich ist dies falsch, da keine ist Verweis auf Sekunde verfügbar für mich und keine Bedingung/Filter für die Sekunde, die nicht gleich der ersten ist.
Wie reduziere ich diese verschachtelte Schleife mit der bedingten Rückgabe einer Auflistung an einen Lambda-Ausdruck?
Jede Hilfe hier wird sehr geschätzt.
Das ist hart, weil Ihr 'newAttribute = newAttribute.add (...)' Updates sind nicht parallelizable. Dies wäre einfacher, wenn Sie alle "computeChange" -Ergebnisse aggregieren und dann ein "Attribut" (oder "Element") aus diesem Aggregat erstellen könnten. –
Ich würde es einfach so lassen wie es ist. –
Was gibt 'computeChange' zurück? Ein 'Element',' Attribut' oder eine Zahl? –