下面的Java是如何;“继续”;代码转换成Scala?

下面的Java是如何;“继续”;代码转换成Scala?,scala,Scala,我不一定需要逐行翻译,但我正在寻找“Scala方法”来处理这类问题。最简单的方法是将跳过的代码嵌入到一个与您所拥有的相反的if中 请参见通常,您会在开始之前通过过滤来避免这些情况: for (String stock : allStocks) { Quote quote = getQuote(...); if (null == quoteLast) { continue; } Price price = quote.getPrice();

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

最简单的方法是将跳过的代码嵌入到一个与您所拥有的相反的
if


请参见

通常,您会在开始之前通过过滤来避免这些情况:

for (String stock : allStocks) {

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

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

}
(此示例显示了如果需要部分结果,您将如何执行这些结果)。我使用了一个视图,以便根据需要计算结果,而不是在每个步骤中创建一组新集合

实际上,您可能会有引号和这样的返回选项——看看StackOverflow上的示例,了解如何使用这些值而不是空返回值

但是,无论如何,如果这类事情不能很好地工作(例如,因为您生成了太多需要保留的中间结果,或者您依赖于更新可变变量,并且您希望保持评估模式简单,以便您知道何时发生了什么),并且您无法以不同的方式设想问题,可能是更健壮的方式,然后您可以

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

对于(stock如果关注的是
continue
而不是
null
处理,只需定义一个内部方法(在scala中,
null
处理部分是另一个习惯用法):

def扶手锁(库存:字符串):单位{
val quote=getQuote(…)
if(null==quotellast){
返回
}
val price=quote.getPrice();
如果(空==价格){
返回
}
}

对于(股票您的控制结构可以非常习惯地映射到以下
for
循环中,并且您的代码演示了Scala的
for
循环设计的过滤类型

def handleStock(stock: String): Unit {
  val quote = getQuote(...)
  if (null == quoteLast) {
    return
  }

  val price = quote.getPrice();
  if (null == price) {
    return
  }
}

for (stock <- allStocks) {
  handleStock(stock)
}

这个解决方案可能不适用于所有可能使用
continue
的不同类型的更复杂的流,但它确实解决了许多常见的流。

在这种情况下,您不需要continue或breakable或类似的东西:选项和理解非常好地完成了这项任务

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

股票您是否可以控制
getQuote
getPrice
的签名?如果可以,您可以让他们返回
Option[Quote]
Option[Price]
。您的for“循环”的其余部分缺少。它当前不起任何作用。这是否意味着必须为所有有效匹配调用两次getQuote?@deltanovember-在我的示例代码中是否看到任何重复的
getQuote
?值被存储;这就是为什么首先有一个映射,然后是一个筛选器。您的筛选器确实比需要的复杂得多,而且还有abs完全不需要在for construction版本中使用breakable。@Miles Sabin-在这个特定的示例中是允许的,但我假设返回值为null并不是使用continue的唯一情况。因此,我想显示可以工作的方法,而不管它是x==null还是length==0或其他什么。breakable使用异常来实现这种控制流,对吗?Option的伴生对象的apply方法将为您执行空检查:用Option()替换变量中的显式空检查你最终会得到我的。@迈尔斯:这当然是正确的,但它不会显示提问者可能想知道的
if
过滤器,你必须解释
选项
构造函数的作用。我不太确定……在我看来,他有一个典型的问题实例,它有一个更好的单元解决方案是的,问题中有条件句,但其含义是提问者不认为这个用法是惯用的……我同意;-)
for {stock <- allStocks.view
     quote = getQuote(...)
     if quoteLast != null
     price = quote.getPrice
     if null != price
    }{
      // whatever comes after all of the null tests
    }
val goodStocks = allStocks.view.
  map(stock => (stock, stock.getQuote)).filter(_._2 != null).
  map { case (stock, quote) => (stock,quote, quote.getPrice) }.filter(_._3 != null)
val stocksWithPrices =
  for {
    stock <- allStocks
    quote <- Option(getQuote(...))
    price <- Option(quote.getPrice())
  } yield (stock, quote, price);