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;
         });