登录
首页 >  文章 >  java教程

为什么我的 forEach lambda 不允许我使用 Java 中的 return 语句退出函数?

来源:dev.to

时间:2024-11-19 09:10:01 304浏览 收藏

积累知识,胜过积蓄金银!毕竟在文章开发的过程中,会遇到各种各样的问题,往往都是一些细节知识点还没有掌握好而导致的,因此基础知识点的积累是很重要的。下面本文《为什么我的 forEach lambda 不允许我使用 Java 中的 return 语句退出函数?》,就带大家讲解一下知识点,若是你对本文感兴趣,或者是想搞懂其中某个知识点,就请你继续往下看吧~

为什么我的 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 语句退出函数?》文章吧,也可关注golang学习网公众号了解相关技术文章。

声明:本文转载于:dev.to 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>