Java 8中任意类类型的Stream Reduce

3

好的,这不是一个作业问题,而是一个“我正在学习Java 8并希望最终通过认证考试”的问题。

我正在尝试理解reduce()方法,以将一个任意类别(不是大多数示例代码使用的字符串或整数)的列表减少为我的代码的单个成员。

package playground;

import java.util.Arrays;
import java.util.List;

public class TestClass {

public static class MyClass {

    private int accumulator = 0;

    public MyClass() {

    }

    public MyClass(int initValue) {
        this.accumulator = initValue;
    }

    public int getAccumulator() {
        return accumulator;
    }

    public void setAccumulator(int accumulator) {
        this.accumulator = accumulator;
    }


}

public static void main(String... args) {

    MyClass mc1 = new MyClass(6);
    MyClass mc2 = new MyClass(8);
    MyClass mc3 = new MyClass(3);

    List<MyClass> myList = Arrays.asList(mc1, mc2, mc3);
    MyClass finalClass = myList.stream().reduce(new MyClass(0), 
        // need the correct lambda function here
    );


}

}


你需要一些东西来决定如何组合两个 MyClass 实例。 - Rogue
这就是我需要帮助的地方。Lambda函数对我来说是新的,我正在尝试学习如何使用它们。 - Jason
3
(m1, m2) -> new MyClass(m1.getAccumulator() + m2.getAccumulator()) - Spotted
1
由于您的类似乎是有意可变的,因此使用.collect(MyClass::new, (c, e) -> c.setAccumulator(c.getAccumulator() + e.getAccumulator()), (c1, c2) -> c1.setAccumulator(c1.getAccumulator() + c2.getAccumulator()) ); 可能更有效。请参阅Mutable Reduction - Holger
可能吧,但是JynXXedRabbitFoot的回答更容易理解一些。 - Jason
1
当然可以,但由于这是为教育目的而设计的,学习Reduction和Mutable Reduction之间的区别以及它们的优缺点是值得的。 - Holger
1个回答

7

Something to the effect of:

MyClass finalClass = myList.stream()
    .reduce((a, b) -> new MyClass(a.accumulator + b.accumulator))
    .orElse(new MyClass(0));

这需要两个输入,必须用括号括起来,并将它们缩减为一个输出。请注意,这里返回一个Optional

处理这个问题的简单方法是使用orElse,它相当于:

if(myList.size() == 0){
    return new MyClass(0);
}

好的,这返回一个Optional<MyClass>,但是除此之外都很好。我看了一下其他带有BiFunction<U, ? super T>和BinaryOperator<U>签名的函数,但是无法真正理解它们。 - Jason
1
@Jason 注意在 reduce 后面的 orElse Stream 操作,它可以优雅地处理可选项。只有当原始的 List 为空时,你才会跳转到 orElse。这使得它的返回类型为 MyClass - JynXXedRabbitFoot
好的,我明白了。不幸的是,我等太久了,无法编辑我的原始评论。 - Jason
1
@Jason 不用担心,这样你明白了吗? - JynXXedRabbitFoot
不完全,但对于那个用例来说是可以的。我仍在努力弄清楚如何使用更复杂的reduce()版本。我会继续努力的。 - Jason

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接