Vergleichen wir beim Schreiben von Code, der einfache Anforderungen erfüllt, den Fall ohne Lambda mit dem Fall damit. Bereiten Sie eine Liste mit Zahlen wie die folgende vor und überlegen Sie, wie Sie die Zahlen für 100 oder mehr verdoppeln können. Technische Daten: Addieren Sie die Doppel für 100 oder mehr
number-list
final List<Integer> numbers = Arrays.asList(50, 100, 10, 400, 120, 30, 220);
Sie können beispielsweise die Werte in der Liste einzeln überprüfen. Wenn der Wert 100 oder mehr beträgt, verdoppeln Sie den Wert und addieren Sie ihn zur Gesamtsumme. Mit dieser Art der Berechnung ist es einfach und leicht zu verstehen, und es scheint kein großes Problem zu geben. Dies liegt jedoch ein wenig daran, dass die Idee des Ingenieurs, "die Zahlen einzeln zu überprüfen", zwischen den Spezifikationen (Hinzufügen der doppelten für 100 oder mehr) als eine Möglichkeit zur Realisierung liegt. Es kann irreführender Code sein.
without-lambda.java
int total = 0;
for (Integer number : numbers) {
if (number >= 100) {
total += number * 2;
}
}
System.out.println("Total is " + total);
Die Gesamtmenge an Code unterscheidet sich nicht so stark von der oben genannten. Das Lesen des Verarbeitungsablaufs, der aus dem Code ersichtlich ist, ändert sich jedoch. "Filtern Sie 100 oder mehr Zahlen aus der Liste, verdoppeln Sie sie und addieren Sie sie." Ich habe keinen Code geschrieben, der einen nach dem anderen in einer Schleife überprüft. Es kann so ausgedrückt werden, als ob die Spezifikationen (verdoppelt um 100 oder mehr) so beschrieben werden, wie sie sind. Ich denke nicht, dass dies in allen Fällen der Fall ist, aber ich denke, dass Sie in diesem Beispiel Code schreiben können, der weniger irreführend für die erforderlichen Spezifikationen ist.
with-lambda.java
int total = 0;
total = numbers.stream()
.filter(num -> num >= 100)
.map(num -> num * 2)
.reduce(0, (base, value) -> base + value);
System.out.println("Total is " + total);
Recommended Posts