[scala-spark]3. 变量 数据类型 分支与循环

1. 变量定义与初始化

package com.lineshen.chapter2

 object variable {
  def main(args: Array[String]): Unit = {
    val age: Int = 10
    val sal: Double = 10.9
    val name: String = "lienshen"
    val isPass: Boolean = true
    val score: Float = 99.55f
    println(s"${name} ${age} ${score} ${sal}")
  }
}

变量类型可以写可以不写,与golang不同的是,定义类型用 [:type];

当然,scala支持变量类型的推导;

变量申请时,请注意初始化,这一点与java很不同;

val修饰的变量编译之后等于加上了final,保证线程安全;

类型判断与Java一样用 variableName.theInstanceof[variableType];

2.数据类型

Scala与Java有着相同的数据类型,在Scala中数据类型都是对象,也就是说Scala没有java中的原生类型。

Scala的数据类型分为两大类:AnyVal(值类型)和AnyRef(引用类型),注意:不管是AnyVal还是AnyRef都是对象。因此,他有大量的方法可以直接调用。

package com.lineshen.chapter2

object removePara {
  def main(args: Array[String]): Unit = {
    sayHi()
    sayHi

  }
   def sayHi() : Unit ={
     println("Hi, scala")
   }
}

>>Hi, scala
>>Hi, scala

当函数没有形参时,函数的调用可以免去括号(),真的很神奇!

小结:

1. 在Scala中有一个根类Any,是所有数据类型的父类

2. Null类型是scala的特别数据类型,只有一个值null;他是bottom class,是所有anyRef类型的子类

3. Nothing类型也是bottom class,它是所有数据类型对应类的子类,一般抛出异常时最常使用。

4. Scala中低精度向高精度的值自动隐式转换

5. Unit表示无值,与其它语言中的void 等同,用作不反悔任何结果的方法的结果类型。Unit只是一个实例值,写成();

package com.lineshen.chapter2

object nothingCTest {
  def main(args: Array[String]): Unit = {
    sayHello
  }
  // 异常中断:即当我们nothing作为返回值,就明确说明该方法没有正常返回值
  def sayHello() :Nothing = {
    throw  new Exception("抛出异常")
  }
}
val floatVal : Float = 1.1 // 错误:Double无法向Float转换
val doubleVal = 1.2f //正确:Float可以向Double转换

3. 基本数据类型与String之间的转换

// 基本数据类型 -> String
val temp :Int = 1024
val str = temp + ""
// String -> 基本数据类型
str.toInt()
str.toFloat()
str.toDouble()
str.toByte()

4. 分支与循环

package com.lineshen.chapter4

import scala.io.StdIn

object ifelseDemo {
  def main(args: Array[String]): Unit = {
    println("your name:")
    val name = StdIn.readLine()
    if (name == "lienshen")
      println("hello " + name)
    else
      println("you are " + name)
  }
}

在scala中没有swich多分支设计,采用模板match-case,功能十分强大。

关于for循环,变动很大,成为for推导式。

package com.lineshen.chapter4

object forDemo {
  def main(args: Array[String]): Unit = {
    for(i <- 1 to 5) {
      println("hello, Tsinghua University " + i)
    }
}
}
package com.lineshen.chapter4

object forDemo {
  def main(args: Array[String]): Unit = {
    // 支持对集合的遍历,和for range很像
    val list = List("hello", "tsinghua", "hello", "lineshen")
    for (i <- list) {
      println(i)
    }
  }
}

循环守卫,也叫循环保护式。类似于continue,不过scala把continue干掉了(实质是把for循环与判断偶合在了一起,简化代码

package com.lineshen.chapter4

object forDemo {
  def main(args: Array[String]): Unit = {
    // 支持对集合的遍历,和for range很像
    val list = List("hello", "tsinghua", "hello", "lineshen")
    for (i <- list if i == "lineshen") {
      println(i)
    }
  }
}

for引入新变量(实质是for循环与遍历变量的耦合)

package com.lineshen.chapter4

object forDemo {
  def main(args: Array[String]): Unit = {
    // 支持对集合的遍历,和for range很像
    val list = List("hello", "tsinghua", "hello", "lineshen")
    for (i <- list; j = i + " i love you") {
      println(j)
    }
  }
}

for简化循环嵌套(实质是简画代码长度,但是不好写业务逻辑)

package com.lineshen.chapter4

object forDemo {
  def main(args: Array[String]): Unit = {
    // 支持对集合的遍历,和for range很像
    val list_i = List("hello", "tsinghua", "hello", "lineshen")
    val list_j = List(" happy")
    for (i <- list_i; j <- list_j) {
      println(i+j)
    }
  }
}

for循环返回值yield (遍历过程中把结果保存在Vector中,并返回到变量中);主要用于集合中的数据单元处理

package com.lineshen.chapter4

object forDemo {
  def main(args: Array[String]): Unit = {
    // 支持对集合的遍历,和for range很像
    val list = List("hello", "tsinghua", "hello", "lineshen")
    val res = for (i <- list) yield i
    println(res)
  }
}
package com.lineshen.chapter4

object forDemo {
  def main(args: Array[String]): Unit = {
    // 支持对集合的遍历,和for range很像
    val list = List("hello", "tsinghua", "hello", "lineshen")
    val res = for (i <- list) yield if (i == "lineshen") i + " happy"
    println(res)
  }
}

>> List((), (), (), lineshen happy)

for循环的步长控制(可以用守卫,可以用range)

package com.lineshen.chapter4

object forDemo {
  def main(args: Array[String]): Unit = {
    // 支持对集合的遍历,和for range很像
    val list = List("hello", "tsinghua", "hello", "lineshen")
    val res = for (i <- Range(0,3,2)) yield list(i)
    println(res)
  }
}

>> Vector(hello, hello)

for循环不支持break关键字,同样采用循环守卫进行处理。

Scala提供了while循环,但是不支持采用while循环。

发布了652 篇原创文章 · 获赞 1574 · 访问量 297万+
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 代码科技 设计师: Amelia_0503

分享到微信朋友圈

×

扫一扫,手机浏览