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)