前一个例子演示了高阶函数能在你实现API的同时,帮助减少代码重复。高阶函数的另一个重要应用是把它们放在API里使客户代码更简洁。scala的集合类型的特定用途循环方法(这些特殊目的的循环方法定义在特质Iterable中,被List、Set、Array、还有Map扩展)提供了一个很好的例子。
但这里我们先来看看命令式风格的例了,判断传入的List是否包含了负数:
def containsNeg(nums:List[Int]):Boolean = { var exists = false for(num <- nums) if(num < 0) exists = true exists}
然后就可以这样调用:
不过更简洁的定义方式是对传入的List调用高阶函数exists,如:
def containsNeg(nums:List[Int]) = nums.exists(_ < 0)
这个版本的containsNeg能产生和前面的那个一样的结果:
exists方法代表了控制抽象。是scala库提供的特定用途循环架构而不是像while或for那样内建在scala语言里的。因为exists是公开在scala的集合类型API里的,所以它减少的是API的客户代码中的重复。scala的标准库中还有许多其他循环方法。如果你能发现使用它们的机会,那么像exists一样,它们经常能缩短你的代码。