当前位置: 首页 > 面试题库 >

如何使用Lambda初始化字段

公良修竹
2023-03-14
问题内容

我需要一个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接口SAM的lambda表达式(似乎您首先错过了表达式的括号,但无论如何)。

您可以做的是强制转换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;
}


 类似资料:
  • 问题内容: 我想在单个语句(可能包含多个嵌套语句)中声明一个完全填充的地图字段,如下所示: 匿名初始化程序不会这样做,原因与调用返回新填充映射的函数不会这样做的原因相同:匿名初始化程序需要两个顶级语句:一个用于变量声明,一个用于方法或初始化器。 双花括号(和)惯用语可以工作,但是它创建了一个Extended的新类,而我不喜欢由此表示的开销。 Java 8的lambda也许提供了一种更好的方法来实现

  • 如果String和其他类一样,那么如何使用双引号初始化它?

  • 问题内容: 如果String和其他字符串一样是一个类,如何使用双引号将其初始化? 问题答案: Java的设计者决定保留面向对象语言中的原始类型,而不是将所有内容都变成对象,以提高语言的性能。原语存储在调用堆栈中,这需要较少的存储空间,并且操作成本较低。另一方面,对象存储在程序堆中,这需要复杂的内存管理和更多的存储空间。 出于性能原因,Java的String设计为介于基本体和类之间。 例如 注意:

  • 问题内容: 为了将另一个问题分解为更小的部分,我尝试设置所有TextKit组件。但是,更改初始化方法后,我崩溃了。出于测试目的,我将该项目简化为以下内容: 崩溃时出现异常代码EXC_I386_GPFLT。该代码不是很明确。基本问题似乎归结为我如何初始化。 如果我更换 有了这个 然后就可以了。我究竟做错了什么? 问题答案: 看来,做事的方法是将NSLayoutManager添加到NSTextStor

  • 我有一个非常基本的问题。我需要如何为ArrayList键入parrameters才能在BlueJ中使用代码?我有一个方法如下。

  • 我试图初始化一个< code>constexpr引用,但没有成功。我试过了 但我收到了编译时错误 错误:constexpr变量“z”必须由常量表达式初始化 删除< code>const会导致 错误:将对类型“int”的引用绑定到类型“const int”的值会删除限定符 尽管我感觉< code>constexpr自动暗示变量声明的< code>const。 所以我的问题是: < Li > < co