Scala中的构造器和高阶函数
构造器
在定义类时可以定义主构造器。主构造器可以同时声明字段。
1 /** 2 * 主构造器 3 * @author Administrator 4 */ 5 //在scala中,类和方法交织在一起 6 class TestClass51(val name:String = "" ,val age:Int = 0){ 7 8 println("name="+ name + " age=" + age) 9 10 } 11 12 object TestScala51 { 13 def main(args: Array[String]): Unit = { 14 val c = new TestClass51(age = 18) 15 } 16 }
1 /** 2 * 辅助构造器 3 * @author Administrator 4 */ 5 //在scala中,类和方法交织在一起 6 class TestClass52(){ 7 var name:String = "" 8 var age:Int = 0 9 10 def this(name:String){ 11 this() //第一行调用主构造器 12 this.name = name 13 } 14 15 def this(name:String , age:Int){ 16 this(name) //第一行必须调用主构造器或者其他辅助构造器 17 this.age = age 18 } 19 // println("name="+ name + " age=" + age) 20 21 } 22 23 object TestScala52 { 24 def main(args: Array[String]): Unit = { 25 val c = new TestClass52("zhangsan",20) 26 println(c.name) 27 println(c.age) 28 } 29 }
高阶函数
函数可以赋给变量 首先,在scala中,函数是一等公民。
匿名函数 函数的形式是 (形参列表)=>返回值类型
函数作为形参
既然函数可以作为参数,那么在调用的时候我们会传递函数的变量过去。那么,我们可以省略函数的定义,在调用的时候直接把函数的实现(即匿名函数)过去。
函数作为形参 对于只有一个参数的,可以只写函数体。 fun3(a=>a+2) 如果形参只有一个,可以在函数体中使用_代替。 fun3(_+2) 函数作为形参的终极版本。
把匿名函数放在函数体内
1 /** 2 * 高阶函数 要为spark做铺垫的话一定要讲高阶函数 3 * Scala中的语法很灵活,公司要自己统一开发规范. 声明方法可以用def 还可以用val和var 4 * @author Administrator 5 */ 6 object TestScala53 { 7 def main(args: Array[String]): Unit = { 8 //================================================================ 9 //在scala中把函数称之为一等公民 10 def add(a:Int , b:Int) = { 11 a + b 12 } 13 val c = add(3,2) 14 println(c)//打印5 15 //================================================================ 16 17 //需求 将一个函数的实现传递给另外函数 18 //应用场景:将一个函数指定另外一个别名;传递函数的实现给另外的函数 19 def func1 = add _ //指的是将一个函数的实现传递给另外一个函数 而不是忘记了给该函数传递参数 20 println(func1(1,3))//打印4 21 22 //================================================================ 23 24 def func2 = (x:Int) => {x + 2} //匿名函数 25 println(func2(100))//打印102 26 27 //================================================================ 28 29 //定义一个接收函数的函数 30 def func3(f:(Int) => Int) = { 31 f(100) * 2 32 } 33 34 def func4(a:Int) = { 35 a + 1 36 } 37 println(func3(func4 _))//打印202 (100+1)*2 传递一个已有的函数给func3 38 39 println(func3((x:Int) => x + 10))//打印 220 (100+10)*2=220 将一个匿名函数传递给func3 40 41 //Scala中总有一些你意想不到的写法 42 println(func3((x) => x + 10))//打印 220 简写一 类型简写,去掉Int类型 x的类型,程序自己推断 43 println(func3( x => x + 10 ))//打印 220 简写二 44 println(func3(_ + 10)) //打印 220 简写三 45 46 /* 47 以上简写的条件 48 1.匿名函数作为参数 49 2.只有一行代码 50 */ 51 //================================================================ 52 53 def func5(f:(Int,Int) => Int) = { 54 f(2,3) 55 } 56 println(func5((x:Int,y:Int) => x + y))//打印5 57 println(func5((x,y) => x + y)) //打印5 简写一 58 println(func5(_ + _)) //打印5 简写二 59 60 /* 61 总结“_” 所能代表的意义 62 1、用于取元组值 63 2、代表一个占位符 64 3、指的是将一个函数的实现传递给另外一个函数 而不是忘记了给该函数传递参数 65 4、代表符合条件的每一个元素 66 */ 67 68 //================================================================ 69 70 /*常见的高阶函数*/ 71 //1.filter map 72 var d = (1 to 10).filter( _ % 2 == 1).map(_ * 3) 73 println(d.mkString(","))//打印 3,9,15,21,27 74 //filter( _ % 2 == 1) 过滤出1,3,5,7,9 75 76 var e = (1 to 10).filterNot( _ % 2 == 1) 77 println(e.mkString(","))//打印 2,4,6,8,10 78 79 var f = (1 to 10).reduceLeft(_ + _)//reduceLeft是左累加 1+2 3+3 6+4 .....(1+2+3+...+10=55) 80 println(f)//打印 55 81 82 (1 to 10).map("*" * _).foreach(println _) 83 //foreach是操作前面产生的每个元素 84 /* 85 打印输出 86 * 87 ** 88 *** 89 **** 90 ***** 91 ****** 92 ******* 93 ******** 94 ********* 95 ********** 96 */ 97 98 //================================================================ 99 100 //练习 101 def func6(x:Int) = { 102 (x:Int) => { 103 x + 2 104 } * 2 105 } 106 println(func6(1))//打印输出 <function1> 传递进去参数之后就一个函数. 107 println(func6(1)(2))//打印输出8 (如果把x:Int改成y:Int 就会输出6)就近原则 108 } 109 }
作者:SummerChill 出处:http://www.cnblogs.com/DreamDrive/ 本博客为自己总结亦或在网上发现的技术博文的转载。 如果文中有什么错误,欢迎指出。以免更多的人被误导。 |