Написах този код, за да намаля списък с думи до дълъг брой на това колко думи започват с „А“. Пиша го просто, за да науча Java 8, така че бих искал да го разбера малко по-добре [Отказ от отговорност: осъзнавам, че това вероятно не е най-добрият начин за писане на този код; това е само за упражнение!].
Long countOfAWords = results.stream().reduce(
0L,
(a, b) -> b.charAt(0) == 'A' ? a + 1 : a,
Long::sum);
Средният параметър/ламбда (наречен акумулатор) изглежда може да намали пълния списък без крайния параметър „Combiner“. Всъщност Javadoc всъщност казва:
Функцията {@code collector} действа като слят картограф и акумулатор, * което понякога може да бъде по-ефективно от отделно картографиране и редукция, * например когато познаването на предишната намалена стойност ви позволява да избегнете * някои изчисления.
[Редактиране от автора] - Следното твърдение е грешно, така че не позволявайте да ви обърква; Просто го пазя тук, за да не разваля оригиналния контекст на отговорите.
Както и да е, мога да заключа, че акумулаторът трябва просто да извежда 1 и 0, които комбинаторът комбинира. Въпреки това не намерих това особено очевидно от документацията.
Моят въпрос
Има ли начин да видя какъв би бил изходът, преди комбинаторът да се изпълни, за да мога да видя списъка с 1 и 0, които комбинаторът комбинира? Това би било полезно при отстраняване на грешки в по-сложни ситуации, на които съм сигурен, че ще попадна в крайна сметка.
long countOfAWords=results.stream().filter(x->x.charAt(0)=='A').count();
? - person Holger   schedule 04.05.2015