This question already has answers here:
Self Executing Anonymous Functions via Lambdas

(2 个回答)


4年前关闭。




例如,我可能想做这样的分配(在 JavaScript 中):
var x = (function () {
    // do some searching/calculating
    return 12345;
})();

在 Java 中,我如何用 Lambdas 做类似的事情?编译器不
像这样的事情:
Item similarItem = () -> {
    for (Item i : POSSIBLE_ITEMS) {
        if (i.name.equals(this.name)) return i;
    }
    return null;
}();

最佳答案

不,因为 lambda 需要一个目标类型。您能做的最好的事情就是转换表达式:

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

您必须为特定的 lambda 使用正确的功能接口(interface)。如您所见,它非常笨重且无用。

更新

上面的代码是 JavaScript 代码的直接翻译。但是,直接转换代码并不总是能得到最好的结果。

在 Java 中,您实际上会使用 streams 来执行该代码正在执行的操作:
Item similarItem = POSSIBLE_ITEMS.stream()
                                 .filter(i -> i.name.equals(this.name))
                                 .findFirst()
                                 .orElse(null);

上面的代码假设 POSSIBLE_ITEMS 是一个 Collection ,可能是一个 List 。如果它是一个数组,请改用它:
Item similarItem = Arrays.stream(POSSIBLE_ITEMS)
                         .filter(i -> i.name.equals(this.name))
                         .findFirst()
                         .orElse(null);

关于java - Java 是否有立即调用的匿名函数?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39092246/

10-10 06:42