【问题标题】:inner loop (breakable) alternative with the same performance具有相同性能的内循环(易碎)替代方案
【发布时间】:2020-03-30 18:16:50
【问题描述】:

它在 Java 中的样子:

public void perform() {
    outer: while (someCondition) {
        while(someCollection.nonEmpty() && anotherCondition) {
            if (otherCondition) 
                break outer;
            else doSomething();
        }

       try {
          doSomethingWithException();
       } catch (Exception e) {
          break; // breaks outer loop
       }

       doSomethingAnother();
    }
}

任何人都可以在 Scala 中提出替代方案吗?

我已经知道 util.control.Breaks,但是还有其他选择吗?

【问题讨论】:

  • 我猜不是nonEmpty。无论如何,它们可能是替代品,但您应该更具体地了解您的代码。您如何处理集合的每个元素,如何计算其他条件?
  • 这个问题的一个大问题是,所呈现的代码违反了一些核心 FP 原则,例如引用透明性等。 Scala 的方式会从:“实际上正在完成什么?”开始。但未提供该信息。
  • @jwvh,不,不,伙计,让我们跳过 FP 原则并尝试专注于主要任务:退出嵌套循环我只需要在某些条件为真时打破内部循环跨度>
  • @LuisMiguelMejíaSuárez,好的 :) 我们可以跳过收集的那一刻吗?我的主要目标是在某些条件为真时打破循环,并且在 Java/Scala 中使用 break 来实现并不难,但我正在寻找替代方法
  • @Code_VM 那么替代品是什么意思?我认为这意味着惯用的 Scala,即 jwvh 所说的 FP,这也意味着我们需要了解您想要做什么。其他替代方案包括答案中所示的布尔标志、前面提到的递归或具有早期返回语义的高阶方法,如exists。最后,您还提到了性能,这是另一个使问题更广泛的大话题,我现在只关注替代方案,然后担心后者的性能,无论如何,如果它对您很重要,那么就进行基准测试!跨度>

标签: java scala performance loops break


【解决方案1】:

你可以把你的代码改写成这样:

  var continueWhileCondition = true
  while (someCondition && continueWhileCondition) {
    while (someOtherCondition) {
      if (someThirdCondition) {
        continueWhileCondition = false
      }
    }
    if (continueWhileCondition) {
      //here do try/catch
    }
  }

只需添加会中断的其他条件。 但这不是 FP 解决方案,您应该真正使用递归。

【讨论】:

  • 非常感谢!但是性能呢?它可以用scala loopByCond(cond: => Boolean)(funcBody: => Unit): Unit = { if (cond) { funcBody loopByCond(cond)(funcBody) } } 替换,我的问题是在另一个条件为真时打破内循环中的外循环
  • 我不确定您的问题是什么,以及您发布的代码是什么。您将通过在内部循环中将 var continueWhileCondition 更改为 false 来打破外部循环,在下一次迭代中您将退出外部 while。如果您不想继续内部循环,您也可以将 someOtherCondition 设置为 false。这样,当 someThirdCondition 为真时,您将退出两个循环。性能不会改变,因为可以非常快速地检查此布尔变量。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-06-06
  • 2020-03-21
  • 1970-01-01
  • 2023-02-20
  • 2011-05-24
  • 1970-01-01
  • 2014-10-09
相关资源
最近更新 更多