【问题标题】:Returning values from lambdas expressions?从 lambdas 表达式返回值?
【发布时间】:2014-12-31 00:19:21
【问题描述】:

基本上,我正在为 Java 开发一个接口系统,我的接口由组件组成。请记住,我使用的是 OpenGL,因此标准侦听器不可用。

基本上我需要做的是找出界面的“点击”布尔值之一是否返回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 来做到这一点,但由于纯粹的丑陋,我想避免它。

【问题讨论】:

  • 抱歉,没有更多代码,我不知道该怎么办。 forEach 是什么样的?不知道它的参数列表是什么样的,或者kv 的类型,或者_clicked 方法是什么样的,我不知道为什么不允许这样做或有什么帮助。
  • 显然两位回答者已经读懂了你的想法,并弄清楚了Interface.interfaces 的类型。不幸的是,他们似乎提出了两种不同的想法。您可以通过告诉我们来帮助我们,这样我们就不必试图读懂您的想法。
  • @ajb - 显然,_clicked() 将是一个布尔值,因为它包含在一个无条件的 if() 语句中,我已经在问题中声明 Interface.interfaces 是一个HashMap<>。跨度>
  • 其实你并没有说interfacesHashMap<>;您所说的只是“我所有的接口都是抽象的,并且存储在HashMap<> 中”,这并没有真正说明interfaces 标识符。你可能认为这很明显,但事实并非如此。如果您需要我们知道 interfacesHashMap,请明确说明或向我们展示代码。此外,如果它是HashMap,则其中两个答案(一个已删除)建议调用其stream() 方法,而HashMap 不存在该方法。

标签: java foreach lambda java-8


【解决方案1】:

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

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

请注意,尽管这可能会导致短路,但如果 _clicked() 调用之一返回 true,则可能不会评估其他调用。如果点击的调用有副作用,这可能不是你想要的。

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

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

【讨论】:

    【解决方案2】:

    我想你想要的是:

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

    或者:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-12-13
      • 1970-01-01
      • 1970-01-01
      • 2023-01-23
      • 1970-01-01
      • 1970-01-01
      • 2013-08-29
      相关资源
      最近更新 更多