Pisząc aplikacje w Javie, istnieje wiele przypadków użycia dla java.util.Collection
. Od java.util.stream.Stream
został wprowadzony z Java 8, natknąłem się na kilka przypadków użycia, gdzie trudno jest zdecydować, co używać.Decyzja między używaniem strumienia lub pętli
Na przykład: Zamierzasz napisać kilka metod-metod.
public static List<?> filterHashToList(int hash, Collection<?> toFilter) {
return toFilter.stream()
.filter((Object o) -> hash == o.hashCode())
.collect(Collectors.toCollection(LinkedList::new));
}
co pisać to tak:
public static List<?> filterHashToList(int hash, Collection<?> toFilter) {
List<Object> result = new LinkedList<>();
for(Object o : toFilter) {
if(hash == o.hashCode()) {
result.add(o);
}
}
return result;
}
Obie metody będzie produkować ten sam rezultat. java.util.stream.Stream
i java.util.stream.Collector
są interfejsami, więc implementacja może się różnić, jeśli używam niestandardowych strumieni i kolektorów.
Wydaje mi się, że istnieje wiele implementacji tam, wykorzystujących starą fashoined pętlę.
Czy możliwe jest udzielenie odpowiedzi na pytanie, z czego korzystać, przesyłać strumieniowo lub w pętli? A jeśli tak, czy wszystkie implementacje muszą być aktualizowane w razie potrzeby?
A może powinienem podać oba sposoby, wdrażając metody util? Czy powinienem również podać mthed, zwracając strumień po procesie filtrowania, abyś mógł z nim pracować również w razie potrzeby?
Możesz mieć naprawdę łatwy paralelizm ze strumieniami, są one bardziej kompaktowe (niektóre powiedzą "bardziej czytelne") i mają dodatkowe zalety, jeśli twoje strumienie są rzeczywistymi "strumieniami" (coś płynie, dynamicznie - nie na podstawie naprawiona kolekcja jak tutaj). Ale w twoim przypadku myślę, że możesz pójść w obie strony. – mastov
Czy możemy to skrócić do: Preferujemy strumienie, ale w łatwych w użyciu przypadkach oba są w porządku? – narranoid
Chciałbym użyć dwóch prostych zasad: 1. jeśli nie jest zepsuty, nie naprawiaj tego. 2. użyj tego, co uważasz za najbardziej czytelne i możliwe do utrzymania. To powiedziawszy, twoje dwa przykłady nie zwracają tego samego: jeden zwraca ArrayList, a drugi zwraca link Linked. –