Java是否有立即调用的匿名函数?

Dyl*_*guy 5 java lambda

例如,我可能想要做这样的任务(在JavaScript中):

var x = (function () {
    // do some searching/calculating
    return 12345;
})();
Run Code Online (Sandbox Code Playgroud)

在Java中,我如何使用Lambdas做类似的事情?编译器不喜欢这样的东西:

Item similarItem = () -> {
    for (Item i : POSSIBLE_ITEMS) {
        if (i.name.equals(this.name)) return i;
    }
    return null;
}();
Run Code Online (Sandbox Code Playgroud)

laz*_*dog 12

不,因为lambdas需要目标类型.你能做的最好的就是施放表达式:

Item similarItem = ((Supplier<Item>) (() -> {
    for (Item i : POSSIBLE_ITEMS) {
        if (i.name.equals(this.name)) return i;
    }
    return null;
})).get();
Run Code Online (Sandbox Code Playgroud)

您必须为特定的lambda使用正确的功能接口.如你所见,它非常笨重而且无用.


UPDATE

上面的代码是JavaScript代码的直接翻译.但是,直接转换代码并不总能提供最佳结果.

在Java中,您实际上使用来执行代码正在执行的操作:

Item similarItem = POSSIBLE_ITEMS.stream()
                                 .filter(i -> i.name.equals(this.name))
                                 .findFirst()
                                 .orElse(null);
Run Code Online (Sandbox Code Playgroud)

上面的代码假设POSSIBLE_ITEMS是a Collection,很可能是a List.如果是数组,请改用:

Item similarItem = Arrays.stream(POSSIBLE_ITEMS)
                         .filter(i -> i.name.equals(this.name))
                         .findFirst()
                         .orElse(null);
Run Code Online (Sandbox Code Playgroud)