Scala-变量声明、常用类型、条件与块表达式、循环、方法函数的调用

为了方便且内容显示更清楚,这里大部分都是使用scala的shell操作
1、Scala变量声明

//使用val定义的变量值是不可变的,相当于java里用final修饰的变量,鼓励使用val
scala> val i = 1
i: Int = 1

//再给i重新赋值就不允许了
scala> i = 2
<console>:8: error: reassignment to val
       i = 2
         ^

//使用var定义的变量是可变得
scala> var j = 1
j: Int = 1

scala> j=2
j: Int = 2

//Scala编译器会自动推断变量的类型
scala> val str = "hello"
str: String = hello

//必要的时候可以指定类型,格式为 变量名 :类型 = 内容
scala> val str2 : String = "scala"
str2: String = scala

2、Scala常用类型
Scala和Java一样,有7种数值类型Byte、Char、Short、Int、Long、Float和Double(无包装类型)和一个Boolean类型
比如上面定义的有Int类型和String类型

//定义Double类型
scala> val db = 3.14
db: Double = 3.14

//定义Boolean类型
scala> val b = true
b: Boolean = true

3、条件表达式
if,else if,else

//定义Int类型的a,值为1
scala> val a = 1
a: Int = 1

//如果a>0 则将a的值赋给b否则将0的值赋给b
scala> val b = if(a > 0) a else 0
b: Int = 1

scala> val b = if(a > 1) a else 0
b: Int = 0

//支持混合类型表达式,如果a>1不成立,那么String类型的error赋给b
scala> val b = if(a > 1) a else "error"
b: Any = error

//如果缺失else,相当于if (x > ) a else ()
//在scala中每个表达式都有值,scala中有个Unit类,写做(),相当于Java中的void
scala> val b = if(a > 1) a
b: AnyVal = ()

scala> val b = if(a > 1) a else ()
b: AnyVal = ()

//if和else if和else
scala> val b = if(a > 2) "r" else if (a >0 ) a else "error"

scala类型系统以Any为根,分为AnyRefAnyVal 两个分支体系,在AnyRef分支的最底层,有个Null类型的特殊类型,它被当作是所有AnyRef类型的子类型。
更进一步在两个分支共同的最底层类型是Nothing类型,它被当作所有AnyRefAnyVal类型的子类型。

image

使用同样的代码在安装了scala的idea里面执行

object HelloScala {////object表示块里面都是静态方法和静态变量

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

    val a = 1;
    val b = if (a > 0) a else 0
    println(b)

    val c = if (a > 1) a else 0
    println(c)

    val d = if (a > 1) a else "error"
    println(d)

    val e = if (a > 1) a
    println(e)

    val f = if (a > 1) a else ()
    println(f)

    val g = if (a > 1) "r" else  if (a > 0) a else "error"
    println(g)

  }
}

输出

1
0
error
()
()
1

3、块表达式
在scala中{}中可包含一系列表达式,块中最后一个表达式的值就是块的值,如下就是一个块的表达式

scala> val res = {
     | if(a > 1){
     |  1
     | }else if (a < 0){
     |    -1
     | }else{
     |   0
     |   }
     | }
res: Int = 0

idea中

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

      val a = 1;

      val res = {
        if (a > 1){
          1
        }else if(a < 0){
          -1
        }else {
          0
        }
      }
    println(res)
}

4、for循环
Scala中有for循环跟while循环,而for循环用的多
for(变量 <- 表达式 )注:表达式通常指的是一个Range(区间),Array(数组),集合等

//表达式1 to 10返回一个Range(区间)
scala> val r = 1 to 10
r: scala.collection.immutable.Range.Inclusive = Range(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
//每次循环一次从r这个区间中取出一个成员赋给i,类似于java的增强的for循环
scala> for(i <- r){
     | println(i)
     | }

//使用数组
scala> var arr = Array("hadoop","storm","spark")
arr: Array[String] = Array(hadoop, storm, spark)

scala> for (i <- arr){
     | print(i+" ")
     | }
hadoop storm spark

//带条件的for循环
scala> for(i <- r; if i % 2 == 0){
     | print((i * 10) + " ")
     | }
20 40 60 80 100

//for推导式:如果for循环的循环体以yield开始,则该循环会构建出一个集合,每次迭代生成集合中的一个值
scala> val arr2 = for (i <- r) yield i*10
arr2: scala.collection.immutable.IndexedSeq[Int] = Vector(10, 20, 30, 40, 50, 60, 70, 80, 90, 100)

scala> arr2
res4: scala.collection.immutable.IndexedSeq[Int] = Vector(10, 20, 30, 40, 50, 60, 70, 80, 90, 100)

5、map、filter和until的使用
关于for的推导式,有更好用的办法,那就是使用map()

scala> r
res5: scala.collection.immutable.Range.Inclusive = Range(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)

//_表示r中的元素,表示将r中的元素依次取出来乘以10放到新的集合中
scala> val arr3 = r.map(_*10)
arr3: scala.collection.immutable.IndexedSeq[Int] = Vector(10, 20, 30, 40, 50, 60, 70, 80, 90, 100)

scala> arr3
res6: scala.collection.immutable.IndexedSeq[Int] = Vector(10, 20, 30, 40, 50, 60, 70, 80, 90, 100)

但是如果需要带有过滤条件呢,如下

scala> val arr2 = for (i <- r;if i % 2 != 0) yield i*10
arr2: scala.collection.immutable.IndexedSeq[Int] = Vector(10, 30, 50, 70, 90)

scala> arr2
res3: scala.collection.immutable.IndexedSeq[Int] = Vector(10, 30, 50, 70, 90)

这时可以使用filter()

//filter里面是个条件表达式,用来做过滤,将r中的元素取出判断,符合条件的放到新的集合中
scala> val arr4 = r.filter(_ % 2 != 0).map(_ * 10)
arr4: scala.collection.immutable.IndexedSeq[Int] = Vector(10, 30, 50, 70, 90)

scala> arr4
res8: scala.collection.immutable.IndexedSeq[Int] = Vector(10, 30, 50, 70, 90)

如果想跟java那样根据角标取值呢

//获取range的长度,根据根据角标去取
scala> for(i <- 0 to r.length-1) println(r(i))
1
2
3
4
5
6
7
8
9
10

上面使用了r.length-1来获取最大角标,但是scala还给我们提供了until可以直接获取角标范围了

scala> 0 until r.length
res15: scala.collection.immutable.Range = Range(0, 1, 2, 3, 4, 5, 6, 7, 8, 9)

scala> for(i <- 0 until r.length) println(r(i))
1
2
3
4
5
6
7
8
9
10

6、方法和函数的调用
Scala中的+ - * / %等操作符的作用与Java一样,位操作符 & | ^ >> <<也一样。只是有
一点特别的:这些操作符实际上是方法。例如:
a + b
是如下方法调用的简写:
a.+(b)
a 方法 b可以写成 a.方法(b)

scala> 1 + 2
res17: Int = 3

scala> 1.+(2)
warning: there were 1 deprecation warning(s); re-run with -deprecation for details
res18: Double = 3.0

scala> 1.-(2)
warning: there were 1 deprecation warning(s); re-run with -deprecation for details
res19: Double = -1.0

两个整数加减结果成了Double类型,只需要前面一个数自己指定为Int类型即可,如下

scala> val m = 1
m: Int = 1

scala> m.-(2)
res20: Int = -1
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,470评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,393评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,577评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,176评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,189评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,155评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,041评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,903评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,319评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,539评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,703评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,417评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,013评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,664评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,818评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,711评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,601评论 2 353

推荐阅读更多精彩内容