Java 如何使用lambda函数创建新字符串?
我想调用需要字符串参数的方法Java 如何使用lambda函数创建新字符串?,java,lambda,Java,Lambda,我想调用需要字符串参数的方法setValue(),它检查是否可以转换为整数并将其增加1,转换回字符串或使用原始值: String origStr = "123"; MyClass.setValue(() -> { String val = origStr; try { val = String.valueOf(Integer.parseInt(origStr) + 1); } catch(NumberFormatExce
setValue()
,它检查是否可以转换为整数并将其增加1,转换回字符串或使用原始值:
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());
最终字符串origStr=“123”;
设定值(((供应商)(->{
字符串val=origStr;
试一试{
val=String.valueOf(Integer.parseInt(origStr)+1);
}catch(numberformatexe){}
返回val;
}).get());
这里的想法是定义一个lambda并立即调用它——这种模式称为(IIFE),在其他语言(特别是JavaScript和C++)中有点常见,以限制范围。但不幸的是,Java在语法上不允许直接调用lambda;首先必须将其转换为合适的函数接口类型,然后调用其
get()
方法,这使得整个过程相当复杂。最好使用常规方法。这里实际上不需要使用lambda。但是,如果您愿意,可以这样做
class MyClass {
static private String value;
static void setValue(Supplier<String> supplier) {
value = supplier.get();
}
}
威尔很好用。你可以这样做
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);
或者,如果您提供字符串作为参数
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);
如果您的方法必须绝对采用字符串和函数:
-
让我们考虑一下你的方法StValue
由于
setValue()
接受String
参数,因此不能在那里传递lambda。它必须以供应商为例。但最重要的是,你为什么要这么做?对于setter来说,这个逻辑似乎真的很奇怪。我已经用更实际的用法对它进行了更新,解释了为什么我要这样做。如果字符串是有效数字,为什么要增加它?为什么非数字是有效输入?目前,这个变量似乎是某种奇怪的“字符串/数字”混合体。使用这样的字符串不是很好的设计。@Kayaman我需要区分插槽位置。有时我没有得到整数槽号,但我得到一个文本表示-这意味着占用的槽可以在任何地方,但我需要以某种方式区分它。这不是我能影响的东西,这是我必须处理的输入。当然你可以影响它,你是程序员。仅仅因为输入是一些东西并不意味着你被迫做一些事情。例如,输入可能有自己的SlotPosition
类型,它封装了字符串和相关功能。这样做在设计上有很多好处(更强大的输入),而且您仍然可以根据需要将字符串转换为输入/存储格式。我的目标是在不创建临时变量的情况下设置MyClass。我用更现实的用法更新了它,解释了我为什么要这样做。@MichalŠpondr啊,我明白了。在这种情况下,您将在其他语言中使用立即调用的函数表达式(IIFE)。但不幸的是,Java目前不支持这种语法。
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
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;
});