首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Java中编写即时函数调用?提供了JavaScript示例

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

Stack Overflow用户
提问于 2013-02-04 17:38:11
回答 3查看 913关注 0票数 0

如何使用lambda将下面的JavaScript示例转换为Java8中的相应代码。我正在尝试获得Java8的lambda。

虚构的例子。

代码语言:javascript
复制
// js
var isFlag = true,
    name = (function () {
        if (isFlag) return "A";
        else return "B";
    })();
console.log(name);

//outputs: A

我尝试过用Java8编写它,但语法或其他方面有问题。请参见下面的代码。

代码语言:javascript
复制
// 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

谢谢。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-02-04 18:46:34

我不是java程序员,但看起来像下面这样的东西能起到作用:

代码语言:javascript
复制
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();
    }   
}
票数 1
EN

Stack Overflow用户

发布于 2013-02-06 10:21:01

您必须提供一个“目标类型”,以便将lambda转换为一个功能接口的实例。如果您不想声明特定类型的变量,强制转换就可以做到这一点。然后,调用函数接口的方法。在这种情况下,我推荐使用Supplier,它不接受任何参数并返回类型T。Supplier的抽象方法是get(),所以这就是您要调用的方法。

试试这个:

代码语言:javascript
复制
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 early access build 73进行测试。)

票数 3
EN

Stack Overflow用户

发布于 2020-05-21 03:04:30

代码语言:javascript
复制
String name = ((Supplier<String>) () -> isFlag ? "A" : "B").get();

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14683931

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档