我需要一个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
答案 0 :(得分:1)
最后一段代码中的问题是编译器无法猜测
() -> {
// code omitted
return null;
}
是一个实现Supplier
接口的SAM的lambda表达式(看起来你首先错过了表达式的括号,但无论如何)。
你可以做的是抛出lambda以告诉编译器这实际上是你实现的Supplier
接口的抽象方法:
private ConnectionFactory connectionFactory =
((Supplier<ConnectionFactory>)() -> {
// code omitted
return null;
}).get();
但是你得到的是什么,而不是有一个初始化器
private ConnectionFactory connectionFactory;
{
//code omitted
connectionFactory = null;
}
或初始化构造函数内的连接或使用最终方法:
private ConnectionFactory connectionFactory = initConnection();
private final ConnectionFactory initConnection() {
//code omitted
return null;
}