1 package com.atguigu.function
2
3 object HighFunction {
4 def main(args: Array[String]): Unit = {
5 /* val fun = (x: Int, y: String, z: Char) => {
6 if (x==0 && y=="" && z=='0'){
7 true
8 }else{
9 false
10 }
11 }
12 println(fun(0,"",'1'))*/
13
14 /*
15 練習 2: 定義一個函數 func,它接收一個 Int 類型的參數,傳回一個函數(記作 f1)。
16 它傳回的函數 f1,接收一個 String 類型的參數,同樣傳回一個函數(記作 f2)。函數 f2 接
17 收一個 Char 類型的參數,傳回一個 Boolean 的值。
18 要求調用函數 func(0) (“”) (‘0’)得到傳回值為 false,其它情況均傳回 true。
19 */
20 def func(x: Int) = {
21 def f1(y: String) = {
22 println("我是f1!")
23
24 def f2(z: Char): Boolean = {
25 println("我是f2!")
26 if (x == 0 && y == "" && z == '0') false else true
27 }
28 f2 _
29 }
30
31 f1 _
32 }
33
34 // func(1)("")('1')
35 }
36
37 println("```````````````````````````")
38
39 def f1() = {
40 var a: Int = 10
41
42 def f2(b: Int) = {
43 a + b
44 }
45
46 f2 _
47 }
48
49 // 在調用時,f1 函數執行完畢後,局部變量 a 應該随着棧空間釋放掉
50 val f = f1()
51 // 但是在此處,變量 a 其實并沒有釋放,而是包含在了 f2 函數的内部,形成了閉合的效果
52 println(f(3))
53 println(f1()(3))
54
55 //閉包
56 /*
57 addByFour函數:
58 内部定義一個局部變量a 固定值是4
59 函數的傳回值是一個嵌套函數,完成a+b的操作,當外部調用時,addByFour()(2)隻需要控制第二個形參的數值
60 而第一個加數永遠是4,相當于固定了一個參數
61 */
62 def addByFour(): Int => Int = {
63 val a = 4
64
65 def addB(b: Int): Int = {
66 a + b
67 }
68
69 addB
70 }
71 println("結果是:" + addByFour()(3)) //4+3
72
函數柯裡化,其實就是将複雜的參數邏輯變得簡單化,函數柯裡化一定存在閉包
1 //函數柯裡化:把一個參數清單的多個參數,變成多個參數清單 也就是fun(a,b,c) -> fun(a)(b)(c) 分層函數調用
2 def addCurry(a : Int)(b:Int):Int ={
3 a+b
4 }
5
作者:靠譜楊,
更多日常分享盡在我的VX公衆号:小楊的挨踢IT生活