在Scala For循环中返回

时间:2013-02-03 11:40:09

标签: scala for-loop return scala-2.10

我是Scala的新手,所以先尝试做一件简单的事。

我写了一个方法,如下所示。

//Given a list of numbers find the first number that is a multiple of 7
  def FindFirstMultiple(input: List[Int]) : Int  = {   
    for (
        i <- input        
        if (i % 7 == 0)
       ) 
      return i        
  }  

此方法提供错误

type mismatch;  found   : Unit  required: Int   

我无法理解这一点。当我没有返回类型并只打印值时,它工作正常。 此外,为什么错误波浪徘徊在i <- input上方。我认为Scala编译器试图告诉我一些事情,而我却无法理解它。这个错误的原因是什么?

2 个答案:

答案 0 :(得分:4)

如果你想用for循环运行它,你还需要添加一个返回0 如在

def FindFirstMultiple(input: List[Int]) : Int  = {   
    for ( i <- input if (i % 7 == 0)) return i 
    0       
  }  

最终值是必需的,因为当if不满足时,它本身不会返回任何内容。

正如用户1779032建议的更好的方法是

def FindFirstMultiple(input: List[Int]) = input.find(i => i % 7 == 0).getOrElse(0)  

答案 1 :(得分:2)

Scala中的

for不是for loop,实际上根本不是循环。它是地图和flatMap以及其他monadic好东西的语法糖。 Monads在函数式编程中非常有用,我建议花点时间学习它们;您可以从http://james-iry.blogspot.com/2007/09/monads-are-elephants-part-1.html开始,按照整个系列进行操作。 感谢詹姆斯·伊里先生。

如果您只想要与查询匹配的第一个项目,请尝试使用

val findFirst:Option[Int] = input.find(i => i % 7 == 0)

findFirst的可用值

  1. 如果找到了某些东西(n),那么n是找到的内容
  2. 如果没有找到任何内容则无。