1. def f(n: Int): Int = {
  2. println("f调用")
  3. n + 1
  4. }
  5. def fun(): Int = {
  6. println("fun调用")
  7. 1
  8. }
  9. val result: Int = f(123)
  10. println(result) // 124

函数作为值进行传递

  1. // 1. 函数作为值进行传递
  2. val f1: Int=>Int = f
  3. //在被调用函数 foo 后面加上 _,相当于把函数 foo 当成一个整体, 传递给变量 f1
  4. val f2 = f _ // f 下划线 表示f这个整体
  5. //打印函数的引用
  6. println(f1) // com.jdxia.chapter01.Student$$$Lambda$3/33524623@224aed64
  7. println(f1(12)) //13
  8. println("=================")
  9. println(f2) // com.jdxia.chapter01.Student$$$Lambda$4/947679291@c39f790
  10. println(f2(35)) // 36
  11. println("=================")

函数作为参数进行传递

  1. // 2. 函数作为参数进行传递
  2. // 定义二元计算函数
  3. //数据和操作都传进来
  4. def dualEval(op: (Int, Int)=>Int, a: Int, b: Int): Int = {
  5. op(a, b)
  6. }
  7. def add(a: Int, b: Int): Int = {
  8. a + b
  9. }
  10. println(dualEval(add, 12, 35)) // 47
  11. println(dualEval((a, b) => a + b, 12, 35)) // 47
  12. println(dualEval(_ + _, 12, 35)) // 47
  13. println("=================")

函数作为函数的返回值返回

  1. // 3. 函数作为函数的返回值返回
  2. def f5(): Int=>Unit = {
  3. def f6(a: Int): Unit = {
  4. println("f6调用 " + a)
  5. }
  6. f6 // 将函数直接返回
  7. }
  8. // val f6 = f5()
  9. // println(f6)
  10. // println(f6(25))
  11. println(f5()(25))

模拟map/filter/reduce

  1. //模拟map映射, filter过滤, reduce聚合
  2. // 1. map映射
  3. def map(arr: Array[Int], op: Int => Int) = {
  4. for (elem <- arr) yield op(elem)
  5. }
  6. val arr = map(Array(1,2,3,4), (x: Int) => {
  7. x *x
  8. })
  9. println("map: " + arr.mkString(","))
  10. // 2. filter过滤. 有参数, 而且参数在后面只使用一次, 则参数省略且后面参数用_表示
  11. def filter(arr: Array[Int], op: Int => Boolean) = {
  12. val arr1 = ArrayBuffer[Int]()
  13. for (elem <- arr if op(elem)) {
  14. arr1.append(elem)
  15. }
  16. arr1.toArray
  17. }
  18. val arr1 = filter(Array(1, 2, 3, 4), _%2 == 1)
  19. println("filter: " + arr1.mkString(","))
  20. //3. reduce聚合
  21. def reduce(arr: Array[Int], op: (Int, Int) => Int) = {
  22. var init: Int = arr(0)
  23. for (elem <- 1 until arr.length) {
  24. init = op(init, elem)
  25. }
  26. init
  27. }
  28. val arr2 = reduce(Array(1, 2, 3 ,4), _*_)
  29. println("reduce: " + arr2)