IntelliJ IDEA polecił mi właśnie teraz, aby zastąpić następującą pętlę dla każdej z wywołań Java 8 „forEach”:
for (Object o : objects) {
if (o instanceof SomeObject) {
doSomething();
}
}
Zalecane połączenie wygląda następująco:
objects.stream().filter(o -> o instanceof SomeObject).forEach(o -> doSomething());
O ile nie rozumiem, jak działa podstawowa funkcjonalność Stream, wydaje mi się, że użycie stream jest operacją O (2n) w przeciwieństwie do operacji O (n) dla standardowej pętli dla każdej pętli.
java
performance
java8
Mirrana
źródło
źródło
Odpowiedzi:
Strumienie Java nie iterują Twojej kolekcji raz dla każdej instrukcji, pomimo tego, co sugeruje składnia. Stosuje cały łańcuch do każdego elementu, po jednym elemencie na raz.
W twoim przypadku strumień działałby dokładnie tak jak pętla. Weź element, sprawdź go względem predykatu, a następnie zastosuj operację, a następnie przejdź do następnego elementu.
źródło