基本上我所做的是我正在使用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;但由于纯粹的丑陋,我想避免它。
答案 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)) {
// ...
}