2016-08-23 77 views
1

例如,我可能想要做的(在JavaScript)像这样的任务:是否有Java的立即调用匿名函数?

var x = (function() { 
    // do some searching/calculating 
    return 12345; 
})(); 

而且在Java中,我该怎么办与Lambda表达式类似的东西?编译器不像 像这样:

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

为什么要这么做?你的JavaScript代码做什么不同,因为它在一个IIFE? – Blorgbeard

+0

我不认为这是可能的,因为编译器需要知道哪个函数接口是精确实现的lambda。 – nitish712

+4

如果您想要立即运行的代码,请编写不带lambda的代码。 –

回答

7

不,因为lambdas需要目标类型。您可以做的最好的表现是:

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

您必须为您的特定lambda使用正确的功能接口。正如你所看到的,它非常笨重,没有用处。


UPDATE

上面的代码的JavaScript代码的直接转换。但是,直接转换代码并不总能给出最佳结果。

在Java中,你会真正使用streams做什么的代码是做:

Item similarItem = POSSIBLE_ITEMS.stream() 
           .filter(i -> i.name.equals(this.name)) 
           .findFirst() 
           .orElse(null); 

上面的代码假定POSSIBLE_ITEMSCollection,可能是List。如果它是一个数组,请使用它来代替:

Item similarItem = Arrays.stream(POSSIBLE_ITEMS) 
         .filter(i -> i.name.equals(this.name)) 
         .findFirst() 
         .orElse(null); 
+0

我喜欢你的答案,但发现它不完整,所以我扩展了它,而不是创建一个新的答案。希望没关系。 – Andreas

+0

我爱流的想法!让我想起了Gulp!这些数据流是否比集合迭代器的速度或记忆效率低? – Dylanthepiguy