Может ли кто-нибудь, пожалуйста, указать мне правильное направление, поскольку я не могу понять проблему.
Я выполняю следующий метод.
private static void reduce_parallelStream() {
List<String> vals = Arrays.asList("a", "b");
List<String> join = vals.parallelStream().reduce(new ArrayList<String>(),
(List<String> l, String v) -> {
l.add(v);
return l;
}, (a, b) -> {
a.addAll(b);
return a;
}
);
System.out.println(join);
}
Он печатает
[ноль, а, ноль, а]
Я не могу понять, почему он ставит два нулевых в результирующемсписок.Я ожидал, что ответ будет
[a, b]
, поскольку это параллельный поток, поэтому первый параметр для уменьшения
new ArrayList ()
, вероятно, будет вызываться дважды для каждого входного значения a и b.
Тогда функция аккумулятора, вероятно, будет вызвана дважды, так как она является параллельным потоком, и передаст каждый вход "a и b" в каждом вызове вместе со списками, представленными с помощью сеяных значений.Таким образом, a добавляется в список 1, а b добавляется в список 2 (или наоборот).После этого комбинатор объединит оба списка, но этого не произойдет.
Интересно, что если я помещу оператор print в свой аккумулятор, чтобы вывести значение ввода, выходной сигнал изменится.Таким образом, следующие
private static void reduce_parallelStream() {
List<String> vals = Arrays.asList("a", "b");
List<String> join = vals.parallelStream().reduce(new ArrayList<String>(),
(List<String> l, String v) -> {
System.out.printf("l is %s", l);
l.add(v);
System.out.printf("l is %s", l);
return l;
}, (a, b) -> {
a.addAll(b);
return a;
}
);
System.out.println(join);
}
приведут к таким выводам
l - это [] l - это [b] l - это [b, a] l - [b, a] [b, a, b, a]
Может кто-нибудь объяснить, пожалуйста.