java - 如何使用 lambda 初始化字段

标签 java design-patterns lambda initialization java-8

我需要一个 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/

相关文章:

python从列表中返回连续整数列表

Javascript:构造函数中的回调

java - 理解 Hibernate 内部结构的最佳方式

java - 用于预约系统的 Swing GUI

java - 错误 :Execution failed for task , 以非零退出值 1 结束

design-patterns - 在D中实现值对象模式

java - 使用 Lambda 表达式,我想使用 Java 语言按整数值排序

C++ Lambda 导致 'candidate function not viable:'

Java ExecutorService 何时调用 shutdown()

java - 重写方法的注释反射