scala编程-函数与闭包

来源:互联网 发布:美工平面设计培训 编辑:程序博客网 时间:2024/05/29 01:53

3.头等函数

3.1

object foreach_test{
    val someNumbers = List(1,2,3,4,5,65)
    //所有集合类都能用到的foreach方法。他以函数作为入参,并对每个元素都调用该函数,下面是如何用他打印输出所有列表元素的代码:
    someNumbers.foreach((x:Int) => println(x))
}
foreach_test

3.2

object myFilter{
    val someNumbers = List(1,2,3,5,7,9)
    //集合类的filter方法选择集合里可以通过用户提供的测试的元素。测试时通过调用作为入参的函数实现的
    val newList = someNumbers.filter((x:Int) => x > 5)
}
println(myFilter.newList)

4.函数字面量的短格式

4.0

//一种让函数字面量更简短的方式是去除参数类型,某些参数的类型是被推断的

object myFilter{
    val someNumbers = List(1,2,3,5,7,9)
    //集合类的filter方法选择集合里可以通过用户提供的测试的元素。测试时通过调用作为入参的函数实现的
    val newList = someNumbers.filter(x => x > 5)
}
println(myFilter.newList)

5占位符语法

5.0

object myFilter{
    val someNumbers = List(1,2,3,5,7,9)
    //为了让函数字面量更加简洁,可以把下划线当做一个会更多参数的占位符,只要每个参数在函数字面量内仅出现一次
    val newList = someNumbers.filter(_ > 3)
}
println(myFilter.newList)


5.1

错误

val f = _ + _

//有时把下划线当做参数的占位符,编译器可能无法推断缺失的参数类型

//error: missing parameter type for expanded function ((x$1, x$2) => x$1.$plus(x$2))
val f = _ + _

正确

val f = (_: Int) + (_:Int)



6.部分应用函数

6.1

object myforeach{
    val someNumbers = List(1,2,34,4,56)
    //等价于someNumbers.foreach(x => println(x))

    //因此这个例子中的下划线不是单个参数的占位符。他是整个列表的占位符。
    someNumbers.foreach(println _)
}
myforeach


以这种方式使用下划线时,你就正在写一个部分应用函数。scala里当你调用函数,传入任何需要的参数,实际是把函数应用的到参数上。

0 0
原创粉丝点击