如何使用lambda将以下JavaScript示例转换为Java 8中的相应代码。我试图获得Java 8 lambda 做了一个例子。
// js
var isFlag = true,
name = (function () {
if (isFlag) return "A";
else return "B";
})();
console.log(name);
//outputs: A
我曾尝试用Java 8编写它,但语法或其他东西是错误的。请参阅以下代码。
// LambdaTest.java
class LambdaTest {
public LambdaTest() {
boolean isFlag = true;
String name = () -> { //I know this is wrong. It is not an IIFE. But how to write one?
if (isFlag) return "A";
else return "B";
};
System.out.println(name);
}
public static void main(String... args) {
LambdaTest lt = new LambdaTest();
}
}
// outputs:
// LambdaTest.java:4: error: incompatible types: String is not a functional interface
// String name = () -> {
// ^
// 1 error
感谢。
答案 0 :(得分:3)
您必须为要转换为功能接口实例的lambda提供“目标类型”。如果你不想声明那个特定类型的变量,那么强制转换就可以了。然后,调用功能接口的方法。在这种情况下,我建议Supplier
,它不接受任何参数并返回类型T. Supplier
的抽象方法是get()
,这就是你所说的。
试试这个:
import java.util.function.Supplier;
class LambdaTest {
public LambdaTest() {
boolean isFlag = true;
String name = ((Supplier<String>) () -> {
if (isFlag) return "A";
else return "B";
}).get();
System.out.println(name);
}
public static void main(String... args) {
LambdaTest lt = new LambdaTest();
}
}
(从2013年1月中旬开始,使用JDK8早期访问版本73进行测试。)
答案 1 :(得分:1)
我不是java程序员,但似乎这样的事情可以解决问题:
import java.util.concurrent.Callable;
import java.lang.String;
class LambdaTest {
public LambdaTest() {
boolean isFlag = true;
Callable<String> name = () -> {
if (isFlag) return "A";
else return "B";
};
try {
System.out.println(name.call());
} catch (Exception e) {
//cause call can throw exception so we need to handle that
}
}
public static void main(String... args) {
LambdaTest lt = new LambdaTest();
}
}
答案 2 :(得分:0)
String name = ((Supplier<String>) () -> isFlag ? "A" : "B").get();
不过,不确定是否可以执行。