函数和闭包
1.定义函数最通用的方法是作为某个对象的成员,这种函数被称为方法。
2.函数式编程风格:程序应该被解构成若干小的函数,每块实现一个定义完备的任务,组装成复杂的事物
3.局部函数可以定义在另外一个函数的内部,并且局部函数可以访问外部函数的属性
4.=>指明函数左边的东西转化成右边的东西
5.什么叫闭包:
一直一个函数f(x) = x + i ,让你求f(3) = 3 + i。
分析:要得到最终的函数值,你必须知道i的值。i称作开放项。
若上文中定义了 int i = 1 ,则可以得到f(3) = 3 + 1 = 4.
即函数值若想捕获i的值,这一过程被理解为做对函数执行“关闭”操作,所以叫闭包
6.scala的函数是头等函数
package com.scala.stu
import scala.io.Source
/**
* 函数和闭包
*/
object t_007 {
def main(args: Array[String]): Unit = {
/*
* =>指明函数左边的东西转化成右边的东西
*/
var increase = (x: Int) => {//{}代表代码块
println("this is one line")
x + 1
}
println(increase(10))//变量可以通过这种形式进行重新赋值,因为任何函数值都是扩展了若干的function的
var someNumbers = List(-11,-10,-5,0,5,10)
//filter,这个方法选择集合类型里可以通过用户提供的测试的元素
someNumbers = someNumbers.filter { x =>x > 0 }
//_是占位符
someNumbers = someNumbers.filter { _ > 0 }
//foreach,每个集合类都能用的foreach方法,定义在特质Iterable中他是list,set,array,map的共有的超特质
someNumbers.foreach { x => print(x+" ") }
someNumbers.foreach { println _}
//_+_ 将扩展成带两个参数的函数字面量,多个下划线代表多个参数
//只有在需要函数类型的地方,scala才允许你省略这个仅用的_
val f = (_: Int) + (_: Int)
println(f(1,2))
}
//本地函数
def processFile(filename: String , width: Int) {
def processLine(line: String){
println(filename + " :" + line.trim)
}
/*
* def processLine(filename: String,width: Int , line: String){
println(filename + " :" + line.trim)
}
*/
val source = Source.fromFile(filename)
for (line <- source.getLines)//getLines返回枚举类型
processLine(line)
}
//柯里化
def curr(x: Int)(y: Int) = x+y
def first(x:Int) = (y:Int) =>x + y
}