[大数据]连载No5之Scala(特性,数据类型,类,集合,函数)

目录见清单part 4.scala

[大数据]连载No5之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
  }
}