我需要一个 ConnectionFactory 类型的实例字段。 供应商可以做到:
private Supplier<ConnectionFactory> connectionFactorySupplier = () -> {
// code omitted
return null;
};
private ConnectionFactory connectionFactory = connectionFactorySupplier.get();
它可以缩短为一行,如下所示:
private ConnectionFactory connectionFactory = new Supplier<ConnectionFactory>() {
@Override
public ConnectionFactory get() {
// code omitted
return null;
}
}.get();
有没有办法使用 lambda 使其不那么冗长?我已尝试以下方法,但无法编译:
private ConnectionFactory connectionFactory= () -> {
// code omitted
return null;
}.get();
// Compilation failure
// error: lambda expression not expected here
最佳答案
最后一个代码片段中的问题是编译器无法猜测
() -> {
// code omitted
return null;
}
是一个实现 Supplier
接口(interface)的 SAM 的 lambda 表达式(看起来您一开始就错过了表达式周围的括号,但无论如何)。
您可以做的就是强制转换 lambda,以告诉编译器这实际上是您实现的 Supplier
接口(interface)的抽象方法:
private ConnectionFactory connectionFactory =
((Supplier<ConnectionFactory>)() -> {
// code omitted
return null;
}).get();
但是如果没有初始化器,你会得到什么呢
private ConnectionFactory connectionFactory;
{
//code omitted
connectionFactory = null;
}
或者在构造函数中或使用 final方法初始化连接:
private ConnectionFactory connectionFactory = initConnection();
private final ConnectionFactory initConnection() {
//code omitted
return null;
}
关于java - 如何使用 lambda 初始化字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33822363/