繁体   English   中英

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

[英]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:

  • 让我们考虑您的方法 setValue
    private static String setValue(String t, Function<String, String> f) {
        return f.apply(t);
    }
  • 因此,您将需要一个 String 参数和一个 lambda :
         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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM