UNORDERED
zasadniczo oznacza, że kolektor jest zarówno asocjacyjny (wymagany przez specyfikację), jak i przemienny (niewymagany).
Skojarzenie umożliwia dzielenie obliczeń na podelementy, a następnie łączenie ich w pełny wynik, ale wymaga ścisłego uporządkowania etapu łączenia. Zbadać ten fragment z docs:
A a2 = supplier.get();
accumulator.accept(a2, t1);
A a3 = supplier.get();
accumulator.accept(a3, t2);
R r2 = finisher.apply(combiner.apply(a2, a3)); // result with splitting
w ostatnim etapie, combiner.apply(a2, a3)
argumenty muszą pojawiać się w dokładnie tej kolejności, co oznacza, że cała obliczenie rurociąg musi śledzić kolejność i szanować go w końcu.
Innym sposobem powiedzenia tego jest to, że drzewo, które otrzymujemy z podziału rekursywnego, musi zostać uporządkowane.
Z drugiej strony, jeśli operacja łączenia jest przemienna, możemy łączyć dowolne inne części w dowolnej kolejności i zawsze uzyskiwać taki sam wynik. Oczywiście prowadzi to do wielu możliwości optymalizacji zarówno w wymiarze przestrzennym, jak i czasowym.
Należy zauważyć, że w JDK znajdują się kolektory UNORDERED
, które nie gwarantują przemienności. Główną kategorią są kolektory "wyższego rzędu", które składają się z innych kolektorów niższego rzędu, ale nie wymuszają na nich właściwości UNORDERED
.
'CONCURRENT' nie oznacza, co Twoim zdaniem oznacza. –
UNORDERED oznacza po prostu nie zamówione. Nie ma gwarancji, jaką kolejność uzyskasz. –
* "Nie jest to zbyt pomocne bez żadnych przykładów." * - ograniczasz swoją potencjalną przestrzeń odpowiedzi, oczekując próbek kodu. Wiele specyfikacji i dokumentacji pojawia się tylko w prozie. – the8472