Sucht nach dem ersten element durch das Prädikat

Ich habe gerade angefangen zu spielen mit Java 8 lambdas und ich bin zu versuchen, einige der Dinge, die ich verwendet, um in funktionalen Sprachen.

Zum Beispiel, die meisten funktionalen Sprachen haben eine Art von find-Funktion, die arbeitet auf Sequenzen oder Listen, gibt das erste element, für das das Prädikat true. Der einzige Weg, ich kann sehen, dies zu erreichen in Java 8 ist:

lst.stream()
    .filter(x -> x > 5)
    .findFirst()

Aber es scheint ineffizient zu mir, als die filter scannt die gesamte Liste, zumindest nach meinem Verständnis (und das kann falsch sein). Gibt es einen besseren Weg?

Es ist nicht ineffizient, Java 8 Stream-Implementierung lazy ausgewertet, so dass filter wird nur angewendet, um die terminal-Betrieb. Gleiche Frage hier: stackoverflow.com/questions/21219667/stream-and-lazy-evaluation
Cool. Das ist, was ich hoffte, es würde tun. Es wäre schon eine große design-flop sonst.
Wenn Ihre Absicht ist, wirklich zu prüfen, ob die Liste enthält so ein element überhaupt (nicht einzelne aus der ersten von möglicherweise mehreren), .findAny() kann theoretisch effizienter sein, in einem parallell-Einstellung, und natürlich kommuniziert, dass die Absicht deutlicher.
Im Vergleich zu einer einfachen forEach-Zyklus, so würde es zu viele Objekte auf dem heap, und Dutzende von dynamischen Methodenaufrufen. Während dies vielleicht nicht immer auf die bottom-line performance-tests, die in den "hot spots" es macht einen Unterschied, zu unterlassen, die triviale Nutzung von Strom und ähnliche Schwergewichts-Konstrukte.

InformationsquelleAutor siki | 2014-05-16

Schreibe einen Kommentar