例如,我可能想做这样的分配(在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使用正确的功能接口。如您所见,它非常笨拙,没有用。
更新
上面的代码是JavaScript代码的直接翻译。但是,直接转换代码并不能总是获得最佳结果。
在Java中,您实际上将使用流来执行该代码正在执行的操作:
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);
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句