Napisałem ten kod, aby zmniejszyć listę słów do dużej liczby słów zaczynających się na "A". Piszę to tylko, żeby nauczyć się Java 8, więc chciałbym to trochę lepiej zrozumieć [Uwaga: zdaję sobie sprawę, że to prawdopodobnie nie jest najlepszy sposób napisania tego kodu; to tylko ćwiczenie!].Java8 stream.reduce() z 3 parametrami - uzyskanie przezroczystości
Long countOfAWords = results.stream().reduce(
0L,
(a, b) -> b.charAt(0) == 'A' ? a + 1 : a,
Long::sum);
środkowy parametr/lambda (zwany akumulator) wydaje się być zdolne do zmniejszenia pełną listę bez końcowego parametru „sumator”. W rzeczywistości, Javadoc rzeczywiście mówi:
Opcja {} function @code akumulator działa jako skondensowanego odwzorowującym i akumulatorze, *, która czasami może być bardziej wydajny niż oddzielnym mapowania i redukcji * przykład gdy wiedząc poprzednio zmniejszona wartość pozwala uniknąć pewnych obliczeń na *.
[Edit od autora] - Poniższe oświadczenie jest źle, więc nie pozwól, by mylić; Po prostu trzymam to tutaj, więc nie niszczę pierwotnego kontekstu odpowiedzi.
W każdym razie mogę wywnioskować, że akumulator musi po prostu wyprowadzać 1 i 0, które łączy kombinator. Jednak nie znalazłem tego szczególnie oczywistego z dokumentacji.
Moje pytanie
Czy istnieje sposób, aby zobaczyć, jakie wyjście byłoby zanim wykona sumator więc mogę zobaczyć listę 1 i 0, że kombajny sumator? Byłoby to pomocne w debugowaniu bardziej złożonych sytuacji, które na pewno napotkam w końcu.
Dlaczego nie po prostu 'long countOfAWords = results.stream(). Filter (x-> x.charAt (0) == 'A'). Count();'? – Holger
Zdecydowanie mógłbym, ale po prostu bawiłem się nowymi mechanizmami dla doświadczenia; to nie był prawdziwy kod :) –