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