例如,我可能想要做这样的任务(在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) 假设您有一个Optional,并且您想要多次使用该Optional。\n您现在可以将该Optional保存到一个变量中;然后使用ifPresent两次:
Optional<Animal> optionalAnimal = animalService.getAllAnimals().findFirst();\noptionalAnimal.ifPresent(Animal::eat);\noptionalAnimal.ifPresent(Animal::drink);\nRun Code Online (Sandbox Code Playgroud)\n另一种解决方案是放弃方法引用并使用同时执行这两项操作的 lambda:
\nanimalService.getAllAnimals().findFirst()\n .ifPresent(animal -> {\n animal.drink();\n animal.eat();\n });\nRun Code Online (Sandbox Code Playgroud)\n如果我可以控制可选中使用的类,我可以简单地更改方法以使用类似工厂的模式。这样它animal.drink()就会自行返回。\n然后我可以写:
animalService.getAllAnimals().findFirst()\n .map(Animal::drink)\n .ifPresent(Animal::eat);\nRun Code Online (Sandbox Code Playgroud)\n但这在语义上会很奇怪。而且我不\xe2\x80\x99t 总是可以控制我在可选中使用的每个类。有些类是最终的,所以我什至无法将它们扩展为具有工厂样式的方法。
\n此外,Optional 类也是final 类,因此扩展Optional 本身也不是选择。\n所有这些对我来说毫无意义。ifPresent()返回无效。如果ifPresent()返回可选本身(类似于peek()流),它将更接近我的目标。
还有其他我没有想到的解决方案吗?
\n我想要的是这样的:
\nanimalService.getAllAnimals().findFirst()\n .ifPresent(Animal::drink)\n .ifPresent(Animal::eat);\nRun Code Online (Sandbox Code Playgroud)\n 在JavaScript中,可以编写一个这样的自执行函数:
(function foo() {
console.log("bar");
}());
Run Code Online (Sandbox Code Playgroud)
我希望用Java做到这一点.例如:
// This code does not work obviously
public static void main(String[] args) {
(foo() {
System.out.println("bar");
}());
}
Run Code Online (Sandbox Code Playgroud)
有这样的事吗?