我是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编译器试图告诉我一些事情,而我却无法理解它。这个错误的原因是什么?
答案 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)
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
的可用值