[大数据]连载No5之Scala(特性,数据类型,类,集合,函数)
目录见清单part 4.scala
定义常量val (不可更改)
定义变量var
定义方法 def(Unit方法的返回值)
//常量 val name: String = "xiaoshitou" //变量 var age = 10 //Unit说明这个方式没有返回值 def sayName(): Unit = { printf("name:" + name + "\tage:" + age) }
类构造函数
class Persion(para1: String, para2: Int) { var name = para1 var age = para2 //多个构造函数 var sex = 1 def this(para1: String, para2: Int, para3: Int) = { this(para1, para2); sex = para3 } }
//if else if (age > 18) printf("大于18") else if (age > 20) printf("大于20") else printf("else")
//for 循环 打印 1...10 println(1 to 10) println(1 until 10) println(1.to(10, 3)) println(1.until(10, 3)) for (i <- 1 to 10) { println("for i :" + i) }
//双层for循环 for (i <- 1 to 10; j <- 1 to 9) { println("双层for循环 :" + i + "\t" + j); }
//循环带条件 for (i <- 1 to 10; if i % 2 == 0 && i > 6) { print(i + "\t") }
//循环yield var result = for (i <- 1 to 10; if i % 2 == 0 && i > 6) yield i println("循环yield:" + result)
//定义函数这是一个标准的 def add_1(a: Int, b: Int): Int = { return a + b }
//定义函数,这是一个简化版的,最后一行语句的执行结果j就是这个函数的返回值 def add_2(a: Int, b: Int): Int = { a + b }
//创建一个可变参数长度的函数 类似 java (argunent ...) def add_3(ele: Int*) = { for (e <- ele) { printf(e + "\t") } } add_3(1, 2, 3, 4)
//递归函数,求5的阶乘,推测类型需要有依据,找不到根据,推测不出类型 def fun4(a: Int): Int = { if (a == 1) { a } else { a * fun4(a - 1) } } printf("func4:" + fun4(5))
//偏引用函数,是一种表达式,不需要提供h函数需要的所有参数,只需要提供部分 def log(date: Date, log: String): Unit = { println(date + "\t" + log) } val data = new Date(); //下划线作为占位符,表示需要传入的 var logdate = log(data, _: String); logdate("log1") logdate("log1") logdate("log1")
//高阶函数:1:函数的参数是函数 , 2:或者函数的返回类型是函数 def fun1(f: (Int, Int) => Int): Int = { f(100, 200) } def f(a: Int, b: Int) = { a + b } println(fun1(f)) //简写原则;匿名函数,参数再函数中只出现一次可以用_代替 println(fun1((a: Int, b: Int) => { a + b })) println(fun1((_ + _)))
//柯里化函数,实际是高阶函数的简化版 def fun5(a: Int)(b: Int): Int = { a + b } //等同于 def fun5_1(a: Int): (Int) => Int = { def func5_3(b: Int): Int = { return a + b } func5_3 } println(fun5(1)(2)) println(fun5_1(1)(2))
//Tuple 元祖 var t1 = ("a", "b", "c") var t2 = Tuple3("a", "b", "c") println(t1._1 + "\t" + t1._2) var it = t1.productIterator; while (it.hasNext) { //再循环体类不要调用多次hasNext print(it.next()) } //二元组才有调换位置方法 swap //var s2=t2.swap
//模式匹配 var num=1; num match { case 1 => print(1) case 2 => print(2) case 3 => print(3) case _ => print("deflat") }
//trait: 可以类比java中的接口,但比java接口高级些,可以定义方法,也可以实现方法 trait read { def read(name: String): Unit = { println(name) } def listen(name: String): String } class readimpl extends read{ override def listen(name: String): String = { name } }
/** * 样例类 *使用了case关键字定义的类就是样例类,(case classes) ,样例类是特殊的类, * 实现了类构造参数的getter方法,(构造参数默认被声明为var) * 当构造参数被声明为var时,它将帮你实现get和set方法 * 样例类默认实现了toString,equals,copy,hashCode * 可以new,也可以不用new */ case class Person1(name:String,var age:Int) object test_Person1{ def main(args: Array[String]): Unit = { var p1 =new Person1("xiaoming",1) var p2=Person1("xiao",2) //p2.name="xiao"; 不可以重新赋值 p2.age=3 } }