从lambdas表达式返回值?

时间:2014-12-31 00:19:21

标签: java foreach lambda java-8

基本上我所做的是我正在使用Java的接口系统,我的接口由组件组成。请记住,我使用的是OpenGL,因此标准的监听器不可用。

基本上我需要做的是找出其中一个界面"点击" boolean返回true,这里是我编写的代码(希望成功)

if(Interface.interfaces.forEach((k, v)->v._clicked())) {
}

但是,这是不允许的。我的所有接口都是抽象的,并存储在HashMap<>

基本上我要做的是以下内容:

if(!Interface.interfaces.forEach((k, v)->v._clicked())) {
    // Handle game related code
}

其中_clicked()方法(在执行某些逻辑后调用抽象void clicked())将处理与接口相关的代码,因此不需要else语句。这样做的整体概念就是让它点击聊天框等,不会让我的玩家与游戏世界互动。

我有大量的接口,所以以一种漂亮,整洁的方式迭代它们会很好。

如果我不能在这里使用lambda,这非常不幸,我知道我可以使用for / each Entry&lt;&gt;但由于纯粹的丑陋,我想避免它。

2 个答案:

答案 0 :(得分:4)

如建议的那样,如果你只需要确定是否有任何接口从` clicked()返回true,那么使用:

Interface.interfaces.values().stream().anyMatch(Interface::_clicked))

请注意,这可能会短路,如果其中一个_clicked()调用返回true,则其他调用可能无法进行评估。如果点击的呼叫有副作用,这可能不是您想要的。

为确保评估所有点击的通话,您可以改为使用:

Interface.interfaces.stream().map(Interface::_clicked).reduce(false, (a, b) -> a || b);

答案 1 :(得分:3)

我认为你想要的是:

if (Interface.interfaces.values().stream().anyMatch(Interface::_clicked)) {
    // ...
}

或者:

if (Interface.interfaces.values().stream().noneMatch(Interface::_clicked)) {
    // ...
}