我遇到了一个关于局部变量和lambdafunction的奇怪问题,似乎无法处理它。我不断收到错误消息“在封闭范围内定义的局部变量acc必须是最终的或实际上是最终的”

我的代码如下所示:

Accumulator acc = new Accumulator(0, 0);
stream.reduce(0, (sum, value) -> {
    acc = new Accumulator(sum + value, acc.getB()+1);
    return sum + value;
});

如您所见,我正在尝试减少整数流并保留2个值,而不仅仅是减少过程中的1个值。我正在尝试将这些值保存在小助手类Accumulator中,该类具有final int afinal int b来存储这些值。但是,似乎stream.reduce无法达到acc

在我程序的其他部分,包括其他lambda函数,类似的代码结构也可以正常工作(声明局部变量并在lambda函数内部对其进行更改),所以我不知道该怎么做。

示例(stream当然是初始化的):
ArrayList<StudentRecord> studentList = new ArrayList<StudentRecord>();
stream.forEach(student -> {
    studentList.add(student);
});

帮助将不胜感激,
问候

最佳答案

如注释中所述,您不能在lambda表达式内分配局部变量。但是,有一些方法可以调用reduce方法来产生所需的输出。

例如 :

Stream<Integer> stream = Stream.of (1,2,3,4,5);
Accumulator result =
    stream.reduce(new Accumulator(0,0), // initial value
                  (acc, i) -> {acc.a += i;acc.b++; return acc;}, // add current value to
                                                                 // the accumulator
                  (acc1, acc2) -> new Accumulator (acc1.a+acc2.a,acc1.b+acc2.b)); // combine two accumulators
System.out.println ("sum = " + result.a);
System.out.println ("count = " + result.b);

这只会产生一个Accumulator实例(除非您的Stream是并行的)。输出的Accumulator将包含acc.a中的总和和acc.b中的元素数。

输出:
sum = 15
count = 5

我假设这只是出于教育目的。如果不是,那么使用IntStreamsummaryStatistics()来计算总和,元素数量和其他属性(最小值,最大值和平均值)会更有意义。

关于java - Java中的局部变量+ lambda函数出错,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41164566/

10-12 22:29