如何使用lambda初始化字段

时间:2015-11-20 08:46:44

标签: 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

1 个答案:

答案 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;
}