java - Java 中的局部变量 + lambda 函数出错

标签 java variables lambda syntax-error local

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

我的代码是这样的:

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

如您所见,我正在尝试减少整数流并保留 2 个值,而不仅仅是减少过程中的一个值。我试图将这些值保存在小助手类 Accumulator 中,它有一个 final int a 和一个 final 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/

相关文章:

java - java中如何实现线程同步而不影响效率

java - 使用外部存储进行 Vert.x session 管理

swift - : and = 之间的差异

c++ - 在 C++11 上模拟通用/模板化 lambda

java - Playframework 推送到 Websocket

Java:比较两个 xml 的最简单方法

android - 如何使用 SharedPreferences 存储 double?

对 static int 和在 printf 中调用它们感到困惑

java - 使用 Java 8 和 lambda 转换为 Map

python - 在 Python : property decorator or lambda? 中定义属性的首选方式