def f(n: Int): Int = {
println("f调用")
n + 1
}
def fun(): Int = {
println("fun调用")
1
}
val result: Int = f(123)
println(result) // 124
函数作为值进行传递
// 1. 函数作为值进行传递
val f1: Int=>Int = f
//在被调用函数 foo 后面加上 _,相当于把函数 foo 当成一个整体, 传递给变量 f1
val f2 = f _ // f 下划线 表示f这个整体
//打印函数的引用
println(f1) // com.jdxia.chapter01.Student$$$Lambda$3/33524623@224aed64
println(f1(12)) //13
println("=================")
println(f2) // com.jdxia.chapter01.Student$$$Lambda$4/947679291@c39f790
println(f2(35)) // 36
println("=================")
函数作为参数进行传递
// 2. 函数作为参数进行传递
// 定义二元计算函数
//数据和操作都传进来
def dualEval(op: (Int, Int)=>Int, a: Int, b: Int): Int = {
op(a, b)
}
def add(a: Int, b: Int): Int = {
a + b
}
println(dualEval(add, 12, 35)) // 47
println(dualEval((a, b) => a + b, 12, 35)) // 47
println(dualEval(_ + _, 12, 35)) // 47
println("=================")
函数作为函数的返回值返回
// 3. 函数作为函数的返回值返回
def f5(): Int=>Unit = {
def f6(a: Int): Unit = {
println("f6调用 " + a)
}
f6 // 将函数直接返回
}
// val f6 = f5()
// println(f6)
// println(f6(25))
println(f5()(25))
模拟map/filter/reduce
//模拟map映射, filter过滤, reduce聚合
// 1. map映射
def map(arr: Array[Int], op: Int => Int) = {
for (elem <- arr) yield op(elem)
}
val arr = map(Array(1,2,3,4), (x: Int) => {
x *x
})
println("map: " + arr.mkString(","))
// 2. filter过滤. 有参数, 而且参数在后面只使用一次, 则参数省略且后面参数用_表示
def filter(arr: Array[Int], op: Int => Boolean) = {
val arr1 = ArrayBuffer[Int]()
for (elem <- arr if op(elem)) {
arr1.append(elem)
}
arr1.toArray
}
val arr1 = filter(Array(1, 2, 3, 4), _%2 == 1)
println("filter: " + arr1.mkString(","))
//3. reduce聚合
def reduce(arr: Array[Int], op: (Int, Int) => Int) = {
var init: Int = arr(0)
for (elem <- 1 until arr.length) {
init = op(init, elem)
}
init
}
val arr2 = reduce(Array(1, 2, 3 ,4), _*_)
println("reduce: " + arr2)