Java Stream Api:使用reduce来填充集合

cli*_*995 1 java java-stream

我很了解collect() 方法和Collectors 对象。然而,我真的不明白为什么使用reduce来填充集合是不好的。

` 用户 u1 = 新用户(“汤姆”);
用户 u2 = 新用户(“安娜”);
用户 u3 = 新用户(“爱丽丝”);

    BiFunction<Set<String>, User, Set<String>> accumulator = (acc, u) -> {
        acc.add(u.getLogin());
        return acc;
    };
    BinaryOperator<Set<String>> combiner = (s1, s2) -> {
        s1.addAll(s2);
        return s2;
    };

    Stream<User> stream = Stream.of(u1, u2, u3);
    Set<String> logins = new HashSet<>();
    stream.reduce(logins, accumulator, combiner);
    System.out.println(logins);// [Tom, Alice, Anna]`
Run Code Online (Sandbox Code Playgroud)

这是糟糕的代码设计,还是幕后的其他原因?

累积应该在不可变对象上进行吗?

hev*_*ev1 6

根据文档

一般来说,不鼓励流操作的行为参数产生副作用,因为它们通常会导致无意中违反无状态性要求,以及其他线程安全隐患。

.collect并行调用并具有可预测的顺序要容易得多。另一方面,传递给的累加器函数reduce应该是关联的,并且不能按遇到顺序在流中的元素上调用它,特别是对于并行处理。

此外,该操作的含义collect更加清晰,当意图确实是从流的元素创建集合时,应该首选该操作。