如何使用 lambda 初始化字段
How to initialize field using lambda
我需要一个 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;
}
是一个 lambda 表达式,它实现了 Supplier
接口的 SAM(看起来你一开始就错过了表达式周围的括号,但无论如何)。
您可以做的是转换 lambda 以告诉编译器这实际上是您实现的 Supplier
接口的抽象方法:
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;
}
我需要一个 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;
}
是一个 lambda 表达式,它实现了 Supplier
接口的 SAM(看起来你一开始就错过了表达式周围的括号,但无论如何)。
您可以做的是转换 lambda 以告诉编译器这实际上是您实现的 Supplier
接口的抽象方法:
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;
}