如何在Java中编写立即函数调用?提供了JavaScript示例

时间:2013-02-04 09:38:11

标签: javascript lambda java-8

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

感谢。

3 个答案:

答案 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();

不过,不确定是否可以执行。