当前位置: 首页 > 图灵资讯 > 技术篇> 为什么我的 forEach lambda 不允许我使用 Java 中的 return 语句退出函数?

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

来源:图灵教育
时间:2024-09-29 20:23:17

为什么我的 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),
);
</food>

并且要求只接受装满水果的篮子。为了满足这一要求,您决定实现一个 for 循环:

private boolean containtsonlyfruits(list<food> basket) {
for (food food : basket) {
        if (food.getfoodtype() != fruit) {
            return false;
        }
    }
    return true;
}
</food>

然后,你记得你一直在学习 java lambda 还有更实用的方法,所以你决定 foreach lambda 同样的内容写在中间:

private boolean containtsonlyfruits(list<food> basket) {
    basket.foreach(food -&gt; {
        if (food.getfoodtype() != fruit) {
            return false;
        }
    });
    return true;
}
</food>

只有一个错误:

意外返回值

为什么会这样?

lambda 只是一个函数。在这种情况下,它是一个匿名函数,或者换句话说,它是一个没有名称的函数。就像任何其他函数一样,lambda 您可以接收参数并期望返回一些内容。

立即学习“Java免费学习笔记(深入);

当你尝试从 foreach lambda 返回 false 你实际上是在试图退出匿名函数并输出布尔值。但是,foreach 函数预计不会返回任何结果。这根本不是实现这个功能的方法。

事实上,如果你看一看 foreach 你会发现它接受函数的实现 consumer:

default void foreach(consumer super t&gt; 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 -&gt; food.getfoodtype() == fruit);
}
</food>

如果是这样,我们的 lambda 将返回 true。假如我们看一看 allmatch 的内部:

boolean allMatch(Predicate super T&gt; predicate);

我们将看到 allmatch 函数需要一个谓词。

谓词是一个函数接口,就像消费者一样,但它的工作方式有点不同。 consumer 表示接受单个输入参数而不返回结果的操作 predicate 用于测试对象的条件并返回布尔值函数表示参数的谓词(true 或 false) ).

还有其他非常重要的功能界面。你能告诉我他们是什么,他们是如何工作的吗?

保持好奇心!

贡献

写作需要时间和精力。我喜欢写作和分享知识,但我也有账单要付。

如果您喜欢我的作品,请考虑通过“买杯咖啡”捐款:https://www.buymeacoffee.com/raphaeldelio

或者发给我比特币:1hjg7pmghg3z8rath4aiuwr156bgafj6zww

这就是为什么我的 forEach lambda 不允许我使用 Java 中的 return 语句退出函数?详情请关注图灵教育其他相关文章!