Java8 Stream编译器消息 - 局部变量必须是最终的或有效的最终

Jac*_*ack 3 java eclipse java-stream

我有一点问题.当我写这个for循环时,if.getAnswerScore().get(i)....中的变量带有错误消息的下划线: - 我在封闭范围内定义的局部变量必须是最终的或有效的最终.这与流有关吗?也许流不能用于循环?

for (int i = 0; i < 10; i++) {
    correct = active.stream()
        .filter(f -> f.getAnswerScore().get(i).getStatus().equals(AnswerStatus.ANSWERED_CORRECT))
        .count();
}
Run Code Online (Sandbox Code Playgroud)

rge*_*man 6

与匿名内部类一样,lambda表达式只能访问局部变量,如果它们是final"有效最终"(Java 8或更高版本;不是,final但一旦分配就不会更改).

这由JLS第15.27.2节涵盖:

使用但未在lambda表达式中声明的任何局部变量,形式参数或异常参数必须声明final或有效最终(§4.12.4),否则在尝试使用时会发生编译时错误.

必须在lambda体之前明确赋值(§16(Definite Assignment)),否则在lambda体中使用但未声明的任何局部变量,或发生编译时错误.

关于变量使用的类似规则适用于内部类的主体(第8.1.3节).对有效最终变量的限制禁止访问动态变化的局部变量,其捕获可能会引入并发问题.与最终限制相比,它减少了程序员的文书负担.

声明一个final等于的变量i并使用它.

for(int i = 0; i< 10; i++){
     final int j = i;
     correct = active
         .stream()
         .filter(f-> f.getAnswerScore().get(j).getStatus().equals(AnswerStatus.ANSWERED_CORRECT))
         .count();
}
Run Code Online (Sandbox Code Playgroud)