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/p/5645384.html,如需转载请自行联系原作者

相关文章
|
4月前
|
SQL 分布式计算 编译器
Scala:高阶函数、隐式转换(四)
Scala:高阶函数、隐式转换(四)
31 0
|
5月前
|
Scala
172 Scala 高阶函数例子
172 Scala 高阶函数例子
19 0
|
5月前
|
算法 Scala
171 Scala 高阶函数
171 Scala 高阶函数
18 0
|
7月前
|
分布式计算 前端开发 Java
Scala高阶函数与akka 2
Scala高阶函数与akka
38 0
|
7月前
|
算法 Java 编译器
Scala高阶函数与akka 1
Scala高阶函数与akka
36 0
|
12月前
|
Scala
Scala快速入门-9-高阶函数
作为值的函数 创建匿名函数 带函数参数的函数 闭包 柯里化
|
分布式计算 Shell API
scala函数式编程与高阶函数
谈到编程方式有指令式编程、过程化编程、函数式编程,函数式编程在使用时主要的思想就是把运算过程写成一些列嵌套的函数调用。把一组数据通过函数实现运算转化成另一组数据。函数式编程这种方式在我们将来开发Spark、Flink的业务代码时会大量使用。下面列出了一些我们经常使用的进行函数式编程的Iterable trait(可迭代特质)方法。
64 0
|
大数据 网络安全 Scala
大数据Scala系列之高阶函数
大数据Scala系列之高阶函数1.1. 概念如果一个函数的传入参数为函数或者返回值是函数,则该函数即为高阶函数。 1.2. 传入参数为函数Scala中,函数是头等公民,和数字一样。不仅可以调用,还可以在变量中存放函数,也可以作为参数传入函数,或者作为函数的返回值。
1021 0