[英]How to create new String using a lambda function?
我想调用需要 String 参数的方法setValue()
- 它检查是否可以转换为 integer 并将其增加 1,转换回 String 或使用原始值:
String origStr = "123";
MyClass.setValue(() -> {
String val = origStr;
try
{
val = String.valueOf(Integer.parseInt(origStr) + 1);
} catch(NumberFormatException e) {}
return val;
});
但是这是不可能的,我从编译器中得到“ lambda 转换的目标类型必须是接口” 。
知道如何创建这个字符串吗?
编辑:为什么我要这样做? 实际上我使用构建器模式,我想设置它没有临时值:
MYClass x = new MyClass.Builder
.setValue() // here's my code
.setSomethingElse()
.setOneMoreTime()
.build();
这里不需要 lambda。 只需在调用setValue
之前执行代码:
String origStr = "123";
String val = origStr;
try {
val = String.valueOf(Integer.parseInt(origStr) + 1);
} catch(NumberFormatException e) {}
MyClass.setValue(val);
如果您想避免由于链接而导致的暂时性,您可以获得的最接近的是以下内容,我强烈建议您不要这样做,因为它非常难以辨认:
final String origStr = "123";
setValue(((Supplier<String>) () -> {
String val = origStr;
try {
val = String.valueOf(Integer.parseInt(origStr) + 1);
} catch(NumberFormatException e) {}
return val;
}).get());
The idea here is to define a lambda and immediately invoke it — this pattern is known as immediately invoked function expression (IIFE) and is somewhat common in other languages (notably JavaScript and C++) to limit scope. 但不幸的是 Java 在语法上不允许直接调用 lambda; 您首先必须将其转换为合适的函数式接口类型,然后调用它的get()
方法,这使得整个事情变得相当复杂。 最好使用常规方法。
你真的不需要在这里使用 lambda 。 但是,您可以根据需要执行此操作。
class MyClass {
static private String value;
static void setValue(Supplier<String> supplier) {
value = supplier.get();
}
}
现在您可以将任何 function 引用(和 lambda)传递给没有 arguments 并返回字符串的方法。
MyClass.setValue(() -> {
String val = origStr;
try {
val = String.valueOf(Integer.parseInt(origStr) + 1);
} catch(NumberFormatException e) {}
return val;
});
将运作良好。
你可以像这样做你想做的事。
String origStr = "123";
Supplier<String> inc = () -> {
String val = origStr; // must be effective final
try
{
val = String.valueOf(Integer.parseInt(origStr) + 1);
} catch(NumberFormatException e) {}
return val;
};
String v = inc.get();
System.out.println(v);
印刷
124
或者,如果您提供字符串作为参数。
UnaryOperator<String> inc1 = str-> {
try
{
str = String.valueOf(Integer.parseInt(origStr) + 1);
} catch(NumberFormatException e) {}
return str;
};
String result = inc1.apply("123");
System.out.println(result);
印刷
124
如果您的方法必须绝对采用 String 和 function:
private static String setValue(String t, Function<String, String> f) {
return f.apply(t);
}
String origStr = "123";
IcarSubscriptionApplication.setValue(origStr, (String s) -> {
String val = origStr;
try
{
val = String.valueOf(Integer.parseInt(s) + 1);
} catch(NumberFormatException e) {}
return val;
});
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.