我想调用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)
这里不需要 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()
方法,这使得整个事情变得相当复杂。最好使用常规方法。
归档时间: |
|
查看次数: |
91 次 |
最近记录: |