如何使用 lambda 函数创建新字符串?

Mic*_*ndr 0 java lambda

我想调用setValue()需要 String 参数的方法- 它检查是否可以转换为整数并将其增加 1,转换回 String 或使用原始值:

String origStr  = "123";
MyClass.setValue(() -> {
    String val = origStr;
    try
    {
        val = String.valueOf(Integer.parseInt(origStr) + 1);
    } catch(NumberFormatException e) {}
    return val;
});
Run Code Online (Sandbox Code Playgroud)

但是这是不可能的,我从编译器得到“ lambda 转换的目标类型必须是一个接口”

知道如何创建这个字符串吗?

编辑:我为什么要这样做?实际上我使用构建器模式,我想在没有临时值的情况下设置它:

MYClass x = new MyClass.Builder
.setValue()  // here's my code
.setSomethingElse()
.setOneMoreTime()
.build();
Run Code Online (Sandbox Code Playgroud)

Kon*_*lph 5

这里不需要 lambda。只需在调用之前执行代码setValue

String origStr  = "123";
String val = origStr;
try {
    val = String.valueOf(Integer.parseInt(origStr) + 1);
} catch(NumberFormatException e) {}

MyClass.setValue(val);
Run Code Online (Sandbox Code Playgroud)

如果您想避免由于链接而造成的临时性,您可以获得的最接近的是以下内容,我强烈建议您不要这样做,因为它非常难以辨认:

final String origStr = "123";
setValue(((Supplier<String>) () -> {
    String val = origStr;
    try {
        val = String.valueOf(Integer.parseInt(origStr) + 1);
    } catch(NumberFormatException e) {}
    return val;
}).get());
Run Code Online (Sandbox Code Playgroud)

这里的想法是定义一个 lambda 并立即调用它——这种模式被称为立即调用函数表达式(IIFE),在其他语言(特别是 JavaScript 和 C++)中有些常见以限制范围。但不幸的是,Java 在语法上不允许直接调用 lambda;您首先必须将它转换为合适的函数式接口类型,然后调用它的get()方法,这使得整个事情变得相当复杂。最好使用常规方法。

  • @MichalŠpondr 啊我明白了。在这种情况下,您可以使用其他语言中的立即调用函数表达式 (IIFE)。但不幸的是Java目前不支持这种语法。 (2认同)