0

如何使用 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

谢谢。

4

3 回答 3

3

您必须为 lambda 提供“目标类型”才能转换为功能接口的实例。如果您不想声明该特定类型的变量,则强制转换可以解决问题。然后,调用功能接口的方法。在这种情况下,我推荐Supplier,它不带参数并返回类型 T。抽象方法Supplierisget()所以这就是你所说的。

试试这个:

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 进行测试。)

于 2013-02-06T02:21:01.203 回答
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();
    }   
}
于 2013-02-04T10:46:33.770 回答
0
String name = ((Supplier<String>) () -> isFlag ? "A" : "B").get();

不过,不确定这是否是高性能的。

于 2020-05-20T19:04:30.263 回答