У меня есть этот код:

        ComparisonResults comparisonResults = requestsList
                .stream()
                .map(item -> getResponse(item))
                .map(item -> compareToBl(item))
                .reduce(new ComparisonResults(), (result1, result2) ->
                {
                     result1.addSingleResult(result2);
                 //   return result1;
                    return new ComparisonResults(result1);
                });

И этот код b:

        ComparisonResults comparisonResults = requestsList
                .parallelStream()
                .map(item -> getResponse(item))
                .map(item -> compareToBl(item))
                .reduce(new ComparisonResults(), (result1, result2) ->
                {
                     result1.addSingleResult(result2);
                 //   return result1;
                    return new ComparisonResults(result1);
                });

Все, что я делаю, - это создаю объекты ответа, затем преобразовываю их в объекты comaprisonResult и сокращаю их до одного comaprisonResult.

Код a показывает член класса int comparisonResults.num_of_sub_responses==5, который является правильным

Код b показывает член класса int comparisonResults.num_of_sub_responses==10, который вдвое превышает правильный результат.

Java 8 reduce должно быть потокобезопасным, верно?

Я что-нибудь упускаю?

getResponse и compareToBl потокобезопасны

3
Elad Benda2 27 Окт 2015 в 21:01

1 ответ

Лучший ответ

Вы изменяете входящий объект в reduce. Это не правильно. Не помогает то, что вы создаете новый объект после изменения входящего объекта.

Что ты хочешь сделать, это

.collect(ComparisonResults::new, ComparisonResults::addSingleResult,
         (a,b)->/* code to merge two ComparisonResults instances*/);

Если результатом .map(item -> compareToBl(item)) является ComparisonResults или, другими словами, addSingleResult объединяет два экземпляра ComparisonResults, вы можете использовать ComparisonResults::addSingleResult как функцию слияния, хотя это имя немного вводит в заблуждение.

Вам следует внимательно прочитать «Уменьшение »Главы документации и последующей« Мутабельной редукции ».

7
Holger 27 Окт 2015 в 18:11