如何使用 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;
}