以下Java“continue”代码如何转换为Scala?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (11)
for (String stock : allStocks) {

    Quote quote = getQuote(...);
    if (null == quoteLast) {
        continue;
    }

    Price price = quote.getPrice();
    if (null == price) {
        continue;
    }

}

我不一定需要逐行翻译,但我正在寻找“Scala way”来处理这类问题。

提问于
用户回答回答于

在这种情况下,你不需要继续或破译或类似的东西:选项和理解能很好地实现这个技巧,

val stocksWithPrices =
  for {
    stock <- allStocks
    quote <- Option(getQuote(...))
    price <- Option(quote.getPrice())
  } yield (stock, quote, price);
用户回答回答于

一般来说,您尝试在开始之前通过过滤来避免这些情况:

val goodStocks = allStocks.view.
  map(stock => (stock, stock.getQuote)).filter(_._2 != null).
  map { case (stock, quote) => (stock,quote, quote.getPrice) }.filter(_._3 != null)

(这个例子展示了如果你需要它们,你会如何携带部分结果)。我使用了一个视图,以便根据需要计算结果,而不是在每个步骤创建一堆新的集合。

实际上,您可能会有引号和返回选项 - 在StackOverflow中查看如何使用这些代替空返回值的示例。

但是,无论如何,如果这种事情不能很好地发挥作用(例如,因为您产生了太多需要保留的中间结果,或者您正在更新可变变量,并且希望保持简单的评估模式,所以您知道什么时候发生了什么),并且你不能以另一种可能更强大的方式来想象问题,那么你可以

import scala.util.control.Breaks._
for (stock <- allStocks) {
  breakable {
    val quote = getQuote(...)
    if (quoteLast eq null) break;
    ...
  }
}

breakable结构指定了休息时间应该带到哪里。如果你在for循环之外放置breakable,它就像一个标准的Java风格的break。如果你把它放在里面,它的行为就像continue

当然,如果你的条件非常少,你根本不需要继续; 只需使用if语句的else。

扫码关注云+社区