Scala从入门到放弃(二)Scala的基本使用

1.Scala概述
  • scala是一门多范式编程语言,集成了面向对象编程和函数式编程等多种特性。
  • scala运行在虚拟机上,并兼容现有的Java程序。
  • scala源代码被编译成java字节码,所以运行在JVM上,并可以调用现有的Java类库。
2.第一个Scala程序

HelloScala.scala

object HelloScala{
    def main(args:Array[String]){
        println("HelloScala,I love you!")
    }
}

cmd --->e:--->scalac HelloScala.scala
运行过程需要先编译,再执行。


image.png

编译后生成2个文件


编译后生成的文件.png

运行 scala HelloScala
image.png

输出结果Hello Scala
3.Scala的基本语法
3.1 基本概述
  *Scala基本语法:
  * 区分大小写
  * 类名首字母大写(MyFirstScalaClass)
  * 方法名称第一个字母小写(myMethodName())
  * 程序文件名应该与对象名称完全匹配
  *
  * def main(args:Array[String]):scala 程序从main方法开始执行,程序的入口
  *
  * Scala注释:分为单行注释 // 和多行注释 /*  */
  *
  * 引入:import java.util.HashMap
  * 如果想要引入包中的几个成员,可以使用selector(选取器):
  * import java.awt.{color,Font}
  *
  * //重命名成员
  * import java.util.{HashMap => JavaHashMap}
  * //隐藏成员
  * 默认情况下,Scala总归引入 java.lang._、scala._和Predef._ 所以在使用的时候都是省去了scala.的
  *
  */
3.2 常用数据类型

Scala和Java一样,有7种数值类型:Byte、Char、Short、Int、Long、Float和Double(无包装类型)和一个Boolean类型。

3.3 变量声明
object VariableDemo {
  def main(args: Array[String]): Unit = {
    //使用val定义的变量值是不可变的,相当于java里用final修饰
    val i =1
    //使用var定义的变量是可变的,在Scala中鼓励使用val 方便垃圾回收
    val j =1
    //Scala编译器会自动推断变量的类型,必要的时候可以指定类型
    val str : String = "hello world"
    
  }

}
3.3 条件表达式

Scala的条件表达式比较简洁

object ConditionDemo {
  def main(args: Array[String]): Unit = {
    //赋 初值 x
    val x = 1
    //判断x的值,并将结果赋值给y
    val y = if(x>0) 1 else -1
    //打印y值
    println(y)


    //支持混合类型表达式
    val z = if(x>1) 1 else "error condition"
    //打印z值
    println(z)

    //在Scala中 每一个表达式都有值,scala中有一个Unit类,写作(),相当于Java中的void
    //如果缺失else 相当于 val m = if(x >2) 1  else ()
    val m = if(x >2) 1
    println(m)

    //if 和 else if 的混用
    //如果x<0 返回0
    //如果0<=x<1,返回-1
    //如果x>=1返回1
    val k = if(x <0 ) 0 else if (x>=1) 1 else -1
    println(k)

  }

}

运行结果

image.png
3.4 访问修饰符

Scala访问修饰符和Java基本一样,分别有private、protected、public。
默认情况下,Scala对象的访问级别是public
(1) 私有对象
用private关键字修饰的成员仅在包含了成员定义的类或对象内部可见。

object Outer {
  class Inner{
    def start() = println("start")
    def end()=println("end")
   //将pause方法用private修饰
    private def pause() = println("pause")
  }

  def main(args: Array[String]): Unit = {
    new Inner().start()
    new Inner().
    new Inner().end()
  }

}
image.png

(2) protected
和私有成员类似,Scala的访问控制比Java来说稍显严格,在Scala中,由protected定义的成员只能由定义该成员和其派生类型访问。而在Java中,由protected定义的成员可以由同一个包中的其他类型访问。在Scala中,可以通过该其他方式来实现这种功能。

class Super {
  protected def f() = println("f")

}

class Sub extends Super{
  //可以直接调用父类f()
  f() 
}
class Other{
  (new Super).f()//Error:f不可以访问到
}

(3) public
public访问控制为Scala定义的缺省方法,所以没有使用private和protected修饰的成员(定义的类和方法)都是”公开的“,这样的成员可以在任何地方被访问。Scala不需要使用public来指定”公开访问“修饰符。

注意:Scala中定义的类和方法默认都是public的,但在类中声明的属性默认是private的

(4) 作用保护域
作用域保护:Scala中,访问修饰符可以通过使用限定词强调
private[x] 或者protected[x]
private[x]:这个成员除了对[...]中的类或[...]中的包中的类及他么的伴生对象可见外,对其他的类都是private

3.5 Scala运算符

与Java一样,不过Scala的运算符实际上是一种方法。

3.6块表达式
object BlockExpressionDemo {
  def main(args: Array[String]): Unit = {
    val x=0
    //在Scala中{}中包括一系列的表达式,块中最后一个表达式的值就是块的值
    var result = {
      if(x <0){
        -1
      }else if(x >=1){
        1
      }else{
        "error"
      }

    }
    //result的值就是块表达式的值
    println(result)
  }

}

运行结果: error

3.7 循环

在Scala中有for循环和while循环,用for循环比较多
for循环语法结构: for( i < - 表达式/数组/集合)

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

    //for (1 <- 表达式),表达式 1 to 10返回一个Range(区间)
    //每次循环将区间中的一个赋给i
    for (i <- 1 to 10)
      println(i)


    //for(i <- 数组)
    val  arr = Array("a","b","c")
    for (i <- arr)
      println(i)

    //高级for循环
    //每个生成器都可以带一个条件,注意:if前面没有分号

    for(i <- 1 to 3;j <- 1 to 3 if i !=j)
      print(10*i+j+"  ")
    println()
  /*运行结果:
    12 13  21 23  31 32
  */
    //for推导式:如果for循环的循环体以yield开始,则该循环会构造出一个集合
    //每次迭代生成集合中的一个值
    val v = for (i <- 1 to 10) yield i*10
    println(v)
    /*
    运行结果:Vector (10, 20, 30 ... 100)
     */
    
    //表示从1 到 2 不包括3  
    for (i<- 1 until(3))
      print(i+"  ") // 运行结果: 1  2 
  }

}


总结:
1)在scala里没有运算符,+-*/%等操作符实际上都是方法,例如:a+b 是如下方法调用的简写: a+(b)

  1. 在scala中没有++ --的用法
    3)for(i <- 表达式/数组/集合)
    4)在for循环里面可以添加if表达式
    5)有两个特殊的表达式需要了解:
    To 1 to 3 1 2 3 包括3
    Until 1 Until 3 1 2 不包括3
  2. 如果在使用for循环的时候,可以伴随使用yield关键字对结果进行收集。
4.方法和函数
4.1 定义方法
image.png

方法的返回值类型可以不写,编译器可以自动推断出来。但是对于递归函数,必须指定返回类型

4.2 定义函数
image.png
4.3 方法和函数的区别

在函数式编程语言中,函数是“头等公民”,它可以像任何其他数据类型一样被传递和操作
案例:首先定义一个方法,在定义一个函数,然后将函数传递到方法里面。


image.png
object TestScala {
  //定义一个方法
  //方法m1参数要求是一个函数,函数的参数必须是两个Int类型
  def m1(f:(Int,Int) => Int):Int = {
    f(2,6)
  }
  //定义一个函数f1,参数是两个Int类型。返回值是一个Int类型
  val f1 = (x:Int,y:Int) =>x+y

  //定义一个函数f2
  val f2 =(m:Int,n:Int)=> m * n

  //main方法
  def main(args: Array[String]): Unit = {
    //调用m1方法,并传入f1函数
    val r1 = m1(f1)
    println("r1="+r1) //运行结果:r1 = 8

    //调用m1方法,并传入f2函数
    val r2 = m1(f2) //运行结果: r2 = 12

    println("r2 ="+r2)

  }

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

推荐阅读更多精彩内容