相关疑难解决方法(0)

Java lambda具有与匿名内部类不同的变量要求

我有一个匿名的内部类和一个等效的lambda.为什么变量初始化规则对lambda更严格,是否有比匿名内部类更清晰的解决方案或在构造函数中初始化它?

import java.util.concurrent.Callable;

public class Immutable {
    private final int val;

    public Immutable(int val) { this.val = val; }

    // Works fine
    private final Callable<String> anonInnerGetValString = new Callable<String>() {    
        @Override
        public String call() throws Exception {
            return String.valueOf(val);
        }
    };

    // Doesn't compile; "Variable 'val' might not have been initialized"
    private final Callable<String> lambdaGetValString = () -> String.valueOf(val);
}
Run Code Online (Sandbox Code Playgroud)

编辑:我确实遇到了一个解决方法:使用getter for val.

java lambda anonymous-inner-class

20
推荐指数
1
解决办法
1277
查看次数

在Java 8中使用lambdas时出现意外错误

我使用的是Java 8 Update 20 32位,Maven 3.2.3,Eclipse Luna Build id:20140612-0600 32位.

在开始使用lambdas之后,我的项目中的一些类开始报告maven(mvn compile)中的编译错误.

只有在我使用lambdas时才会出现这些错误.如果我切换回匿名类,错误就消失了.

我可以通过一个简单的测试用例重现错误:

package br;

import java.awt.Button;
import java.awt.Panel;

public class Test {

    private final Button button;
    private final Panel panel;

    public Test() {
        button = new Button();
        button.addActionListener(event -> {
            System.out.println(panel);
        });
        panel = new Panel();
    }
}
Run Code Online (Sandbox Code Playgroud)

我这样编译:

mvn clean;mvn compile
Run Code Online (Sandbox Code Playgroud)

我收到这个错误:

[ERROR] /C:/Users/fabiano/workspace-luna/Test/src/main/java/br/Test.java:[14,44] variable panel might not have been initialized
Run Code Online (Sandbox Code Playgroud)

虽然错误信息非常清楚发生了什么(编译器认为最终变量panel在实例化之前被调用),但是在按钮生成动作之前不会调用变量,以及我们怎么也不能说动作何时会发生,代码应该编译.实际上,如果我不使用lambda,它会按照它应该编译:

package br;

import java.awt.Button;
import java.awt.Panel;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public …
Run Code Online (Sandbox Code Playgroud)

java eclipse lambda maven java-8

7
推荐指数
1
解决办法
1万
查看次数

Java Predicate实现无法访问全局final变量

我使用 java 和 springboot 创建了一个简单的休息服务。这是我的服务层代码

@Service
class MyService {
    private final TestService service;

    @Autowired
    public MyService(final TestService service) {
        this.service = service;
    }

    // here is the issue
    private final Predicate<User> userPredicate = (user) -> this.service.isValidUser(user);
}
Run Code Online (Sandbox Code Playgroud)

在上面的行中,抱怨变量服务的 ide 可能未初始化,并且我无法在谓词实现中使用它。我尝试删除服务中的final,这有效,但我不想删除TestService 声明中的final。

有人有什么解决办法吗?

java lambda

4
推荐指数
1
解决办法
345
查看次数

标签 统计

java ×3

lambda ×3

anonymous-inner-class ×1

eclipse ×1

java-8 ×1

maven ×1