为什么我的 forEach lambda 不允许我使用 Java 中的 return 语句退出函数?
假设你有一篮子食物:
List<Food> basket = List.of( new Food("Apple", FRUIT), new Food("Banana", FRUIT), new Food("Carrot", VEGETABLE), new Food("Orange", FRUIT), );
并且要求仅接受仅装满水果的篮子。为了满足这个要求,您决定实现一个 for 循环:
private boolean containtsOnlyFruits(List<Food> basket) { for (Food food : basket) { if (food.getFoodType() != FRUIT) { return false; } } return true; }
然后,您记得您一直在学习 Java Lambda 和更实用的方法,因此您决定在 forEach lambda 中编写相同的内容:
private boolean containtsOnlyFruits(List<Food> basket) { basket.forEach(food -> { if (food.getFoodType() != FRUIT) { return false; } }); return true; }
只是遇到一个错误:
意外的返回值
这是为什么?
lambda 只不过是一个函数。在这种情况下,是一个匿名函数,或者换句话说,是一个没有名称的函数。就像任何其他函数一样,lambda 可以接收参数并期望返回一些内容。
当你尝试从 forEach lambda 返回 false 时,你实际上是在尝试退出这个匿名函数并输出一个布尔值。但是,forEach 函数预计不会返回任何结果。这根本不是这个功能的实现方式。
事实上,如果你看一下 forEach 函数的实现,你会发现它接受一个 Consumer:
default void forEach(Consumer<? super T> action) { Objects.requireNonNull(action); for (T t : this) { action.accept(t); } }
消费者是一个接口,表示接受单个输入参数且不返回结果的操作。在此实现中,您可以看到在底层,forEach 函数使用 foreach 循环,执行给定的操作并且不返回任何内容。
因此,为了满足函数式方法中的操作,我们需要找到另一个 lambda。这里有一个很好的候选者:allMatch。
使用 allMatch lambda,我们可以检查篮子中的所有元素是否都是水果:
private boolean onlyFruits(List<Food> basket) { return basket.stream().allMatch(food -> food.getFoodType() == FRUIT); }
如果是这样的话,我们的 lambda 将返回 true。如果我们看一下 allMatch 的内部:
boolean allMatch(Predicate<? super T> predicate);
我们将看到 allMatch 函数需要一个谓词。
谓词是一个函数式接口,就像消费者一样,但它的工作方式有点不同。 Consumer 表示接受单个输入参数且不返回结果的操作,而 Predicate 表示一个参数的谓词(布尔值函数),用于测试对象的条件并返回布尔值(true 或 false) ).
还有其他非常重要的功能接口。你能告诉我它们是什么以及它们如何工作吗?
保持好奇心!
贡献
写作需要时间和精力。我喜欢写作和分享知识,但我也有账单要付。
如果您喜欢我的作品,请考虑通过“买杯咖啡”捐款:https://www.buymeacoffee.com/RaphaelDeLio
或者发送给我比特币:1HjG7pmghg3Z8RATH4aiUWr156BGafJ6Zw
以上是为什么我的 forEach lambda 不允许我使用 Java 中的 return 语句退出函数?的详细内容。更多信息请关注PHP中文网其他相关文章!

热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

Video Face Swap
使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

公司安全软件导致部分应用无法正常运行的排查与解决方法许多公司为了保障内部网络安全,会部署安全软件。...

将姓名转换为数字以实现排序的解决方案在许多应用场景中,用户可能需要在群组中进行排序,尤其是在一个用...

在使用MyBatis-Plus或其他ORM框架进行数据库操作时,经常需要根据实体类的属性名构造查询条件。如果每次都手动...

系统对接中的字段映射处理在进行系统对接时,常常会遇到一个棘手的问题:如何将A系统的接口字段有效地映�...

在使用IntelliJIDEAUltimate版本启动Spring...

Java对象与数组的转换:深入探讨强制类型转换的风险与正确方法很多Java初学者会遇到将一个对象转换成数组的�...

电商平台SKU和SPU表设计详解本文将探讨电商平台中SKU和SPU的数据库设计问题,特别是如何处理用户自定义销售属...

Redis缓存方案如何实现产品排行榜列表的需求?在开发过程中,我们常常需要处理排行榜的需求,例如展示一个�...
