Scala进阶之路-Scala函数篇详解

                                   作者:尹正杰

版权声明:原创作品,谢绝转载!否则将追究法律责任。

 

 

 

 

一.传值调用和传名调用

 1 /*
 2 @author :yinzhengjie
 3 Blog:http://www.cnblogs.com/yinzhengjie/tag/Scala%E8%BF%9B%E9%98%B6%E4%B9%8B%E8%B7%AF/
 4 EMAIL:y1053419035@qq.com
 5 */
 6 package cn.org.yinzhengjie.basicGrammar
 7 
 8 object CalculateDemo {
 9 
10     /**
11       * 定义传值的方法 :
12       *     add方法拥有2个Int类型的参数, 返回值为2个Int的和。
13       */
14     def add(a: Int, b: Int) () = {
15         a + b
16     }
17 
18     /**
19       * 定义传参的方法 :
20       *     add2方法拥有3个参数,第一个参数是一个函数(它拥有2个Int类型的参数,返回值为Int类型的函数), 第二个,第三个为Int类型的参数
21       */
22     def add2(f:(Int, Int) => Int, a: Int, b: Int) = {
23         f(a, b) // f(1, 2) => 1 + 2
24     }
25 
26     /**
27       * 定义传参的方法 :
28       *     第一个参数是一个函数(它拥有1个Int类型的参数,返回值为Int类型的函数),第二个为Int类型的参数。
29       */
30     def add3(a:(Int) => Int, b: Int) = {
31         //这里我们将第二个参数作为第一个函数的签名传递进去
32         a(b) + b
33     }
34     /**
35       * fxx你们函数是符合add2中的“f:(Int, Int) => Int”这个方法签名的,因此我们可以把它当做第一个参数进行传递
36       */
37     val f1 = (a: Int, b: Int) => a + b
38 
39     /**
40       * 定义一个匿名函数,它需要传递一个参数,函数体的返回值是将传入的值乘以10并返回,返回值类型为Int。
41       */
42     val f2 = (x: Int) =>  (x * 10):Int
43 
44     def main(args: Array[String]): Unit = {
45 
46         //传值方式调用
47         val res1 = add(100, 10 + 20)
48         println(res1)
49 
50         //传参方式调用一,我们给匿名函数传参数,最终返回的结果和第二个参数以及第三个参数进行运算
51         var res2 = add(f1(10, 20), 30)
52         println(res2)
53 
54         //传参方式调用二,我们给匿名函数传参数,
55         var res3 = add2(f1, 10, 20)
56         println(res3)
57 
58         //传参方式调用
59         val res4 = add3(f2, 8)
60         println(res4)
61     }
62 }
63 
64 
65 
66 /*
67 以上代码执行结果如下 :
68 130
69 60
70 30
71 88
72  */

 

二.可变参数

 1 /*
 2 @author :yinzhengjie
 3 Blog:http://www.cnblogs.com/yinzhengjie/tag/Scala%E8%BF%9B%E9%98%B6%E4%B9%8B%E8%B7%AF/
 4 EMAIL:y1053419035@qq.com
 5 */
 6 package cn.org.yinzhengjie.basicGrammar
 7 
 8 object VariableParameter {
 9 
10     /**
11       * 定义一个可变参数的方法,参数的类型为任意类型,相当于Java中的Object类,当然你也可以为AnyVal或者AnyRef的子类
12       */
13     def methodManyParams(args: Any*) = {
14         for (item <- args) {
15             print(item + "|")
16         }
17         println()
18     }
19 
20     /**
21       * 可变参数一般放在参数列表的末尾。
22       */
23     def add(des:String, ints:Int*):Int = {
24         var sum = 0
25         for (value <- ints){
26             sum += value
27         }
28         print(des)
29         sum
30     }
31 
32     def main(args: Array[String]): Unit = {
33         methodManyParams("尹正杰", "大数据", "云计算", "人工智能", "机器学习", "自动化运维",2018)
34 
35         var res = add("计算结果 : ", 10, 20, 30, 40)
36         println(res)
37 
38     }
39 }
40 
41 
42 
43 
44 
45 /*
46 以上代码执行结果如下 :
47 尹正杰|大数据|云计算|人工智能|机器学习|自动化运维|2018|
48 计算结果 : 100
49  */

 

三.参数的默认值

 1 /*
 2 @author :yinzhengjie
 3 Blog:http://www.cnblogs.com/yinzhengjie/tag/Scala%E8%BF%9B%E9%98%B6%E4%B9%8B%E8%B7%AF/
 4 EMAIL:y1053419035@qq.com
 5 */
 6 package cn.org.yinzhengjie.basicGrammar
 7 
 8 object DefaultValuesParameters {
 9 
10     /**
11       * 参数定义时可以指定一个默认值
12       * @param path     :   指定程序的安装路径
13       * @param user     :   指定安装的用户
14       */
15     def installationSoftware(path:String = "D:/yinzhengjie/BigData/Spark",user:String="yinzhengjie") ={
16         print(s"安装路径是: $path,当然的安装用户是 : ${user}\n")
17     }
18 
19     def main(args: Array[String]): Unit = {
20         //调用时如果不传递参数,就会使用函数或者方法的默认值
21         installationSoftware()
22         //调用时,如果传递了参数值,就会使用传递的参数值
23         installationSoftware("E:/yinzhengjie/Hadoop/Scala","Administrator")
24         //调用时,如果传递了一个参数,那么就会覆盖第一个参数的值
25         installationSoftware("/home/yinzhengjie/Spark/Scala")
26         //如果想要给指定的参数赋值,可以采用键值对的方式赋值,赋值参数时,参数的名称和方法定义的名称需要保持一致!
27         installationSoftware(user = "root")
28         //当然赋值的方式可以打乱顺序,但是需要以键值对的方式传递哟!
29         installationSoftware(user = "Scala",path = "/home/yinzhengjie/Hadoop/Spark")
30     }
31 }
32 
33 
34 
35 /*
36 以上代码执行结果如下 :
37 安装路径是: D:/yinzhengjie/BigData/Spark,当然的安装用户是 : yinzhengjie
38 安装路径是: E:/yinzhengjie/Hadoop/Scala,当然的安装用户是 : Administrator
39 安装路径是: /home/yinzhengjie/Spark/Scala,当然的安装用户是 : yinzhengjie
40 安装路径是: D:/yinzhengjie/BigData/Spark,当然的安装用户是 : root
41 安装路径是: /home/yinzhengjie/Hadoop/Spark,当然的安装用户是 : Scala
42 */

 

四.高阶函数

   高阶函数的定义:将其他函数作为参数或其结果是函数的函数。要注意的是传入的函数必须符合高阶函数参数中定义的函数签名。

 1 /*
 2 @author :yinzhengjie
 3 Blog:http://www.cnblogs.com/yinzhengjie/tag/Scala%E8%BF%9B%E9%98%B6%E4%B9%8B%E8%B7%AF/
 4 EMAIL:y1053419035@qq.com
 5 */
 6 package cn.org.yinzhengjie.basicGrammar
 7 
 8 object HigherFunction {
 9     /**
10       * 定义一个高级函数:
11       * f: (Int) => String
12       *     第一个参数是带一个整型参数返回值为字符串的函数f
13       *v: Int
14       *     第二个参数是一个整型参数v
15       * f(v)
16       *      返回值为一个函数“f(v)”。
17       */
18     def apply(f: (Int) => String, v: Int) = {
19         //返回的函数“f(v)”,即将第二个参数作为第一个函数的参数。
20         f(v)
21     }
22 
23     // 定义一个方法, 参数为一个整型参数, 返回值为String
24     def layout(args: (Int)):String = {
25         "[" + args.toString() + "]"
26     }
27 
28     def main(args: Array[String]): Unit = {
29         //注意,layout传入的参数个数以及返回值类型都必须符合高阶函数apply中定义的第一个参数的函数签名。
30         println (apply (layout , 150))
31     }
32 }
33 
34 
35 
36 /*
37 以上代码执行结果如下:
38 [150]
39  */
 1 /*
 2 @author :yinzhengjie
 3 Blog:http://www.cnblogs.com/yinzhengjie/tag/Scala%E8%BF%9B%E9%98%B6%E4%B9%8B%E8%B7%AF/
 4 EMAIL:y1053419035@qq.com
 5 */
 6 package cn.org.yinzhengjie.basicGrammar
 7 
 8 object HigherFunctionDemo {
 9 
10     def op(f:(Int,Int)=>Int,a:Int,b:Int):Int = {
11         f(a , b)
12     }
13 
14     def add(a:Int,b:Int):Int = {
15         a + b
16     }
17 
18     def sub(a:Int,b:Int):Int = {
19         a - b
20     }
21 
22     def main(args: Array[String]): Unit = {
23         val res1 = op(add,10,2)
24         val res2 = op(sub,10,2)
25 
26         print(s"res1=====> ${res1}\n")
27         print(s"res2=====> ${res2}\n")
28     }
29 }
30 
31 /*
32 以上代码执行结果如下 :
33 res1=====> 12
34 res2=====> 8
35  */
HigherFunctionDemo.scala 文件内容(高阶函数案例二,将其他函数作为参数传入)

相关文章:

  • 2021-09-13
  • 2022-01-22
  • 2022-12-23
  • 2022-12-23
  • 2021-08-15
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
猜你喜欢
  • 2022-12-23
  • 2021-04-28
  • 2021-09-09
  • 2021-10-24
  • 2021-09-04
  • 2021-09-08
  • 2021-09-28
相关资源
相似解决方案