java8 уменьшая поток используя аккумулятор и сумматор - PullRequest
0 голосов
/ 01 апреля 2020

Я пытаюсь написать простую функцию уменьшения, которая будет проверять , присутствуют ли все элементы srcList в targetList:

List<String> srcList = Arrays.asList("a", "b");
        List<String> targetList = Collections.singletonList("a");

        Boolean result = srcList.stream().reduce(true
                , (prevResult, srcElement) -> targetList.contains(srcElement)
                , (prevResult, currentResult) -> prevResult && currentResult);

System.out.println(result); // prints false as expected

Вышеупомянутая лямбда Кажется, не работает, как ожидалось. Например, если мы изменим элемент в списке целей, результат будет напечатан как true:

List<String> srcList = Arrays.asList("a", "b");
        List<String> targetList = Collections.singletonList("b");

        Boolean result = srcList.stream().reduce(true
                , (prevResult, srcElement) -> targetList.contains(srcElement)
                , (prevResult, currentResult) -> prevResult && currentResult);

System.out.println(result); // prints true

Похоже, что выражение возвращает результат только последней accumulator оценки (т. Е. Операция содержит в этом случае) и комбинатор не выполняет && для всех результатов.

Может кто-нибудь объяснить, пожалуйста?

1 Ответ

3 голосов
/ 01 апреля 2020

Проблема в том, что вы игнорируете prevResult в аккумуляторе:

(prevResult, srcElement) -> targetList.contains(srcElement)

должно быть, например

(prevResult, srcElement) -> prevResult && targetList.contains(srcElement)

Но, честно говоря, было бы проще используйте containsAll:

targetList.containsAll(srcList)
...