Scala基础语法

目录

1. scala简介

2. 为什么要使用scala

3. Scala与java的区别

3. scala的REPL交互式解释器

4. scala中声明变量

5. scala中数据类型

6. scala中的条件表达式

8. 循环

9. 方法和函数


1. scala简介

scala是运行在 JVM 上的多范式编程语言,同时支持面向对象和函数式编程。

2. 为什么要使用scala

  • 开发大数据应用程序(Spark程序、Flink程序);
  • 表达能力强,一行代码抵得上Java多行,开发速度快
  • 由于运行在JVM上,所以它兼容Java,可以访问庞大的Java类库,与Java框架进行互操作。

3. Scala与java的区别

(1)Java程序编译执行流程:

(2)Scala程序编译执行流程:

scala程序运行需要依赖于Java类库,必须要有Java运行环境,scala才能正确执行,即:

要编译运行scala程序需要:

  • jdk ( jvm )
  • scala编译器(scala SDK)

3. scala的REPL交互式解释器

Scala提供的最重要的一个工具是交互模式(REPL)。REPL是一个交互式解释器,可以即时编译、运行代码并返回结果,方便前期做学习和测试。

REPL:R(read)、E(evaluate) 、P(print)、L(loop)

(1)进入Scala:先进入cmd界面,再输入scala 回车即可,如图:

(2)退出scala解释器

    使用 :quit 就可以了

4. scala中声明变量

(1)语法格式

val/var 变量名称:变量类型 = 初始值

如: val a:Int = 10

        var b:Int = 20

其中:

        val定义的是不可重新赋值的变量(值不可修改);

        var定义的是可重新赋值的变量(值可以修改)。

注意与java的区别:

 

  • scala中声明变量是变量名称在前,变量类型在后,跟java是正好相反;
  • scala的语句最后不需要添加分号。

  • #scala中的变量的类型可以显式的声明,也可以不声明,如果不显式的声明这会根据变量的值推断出来变量的类型(scala支持类型推断)

(2)惰性变量

  • Scala中使用关键字lazy来定义惰性变量,实现延迟加载(懒加载)。
  • 惰性变量只能是不可变变量,并且只有在调用惰性变量时,才会去实例化这个变量。
  • 语法格式:lazy val 变量名 = 表达式   (注意此处不能用var声明)。
  • 如:lazy val a:Int=10

5. scala中数据类型

(1)注意下 scala类型与Java的区别:

  • 1. scala中所有的类型都使用大写字母开头,说明是它是“类”;
  • 2. 整形使用Int而不是Integer;
  • 3. scala中定义变量可以不写类型,让scala编译器自动推断。

(2)scala类型层次结构:

类型

说明

Any

所有类型的父类,,它有两个子类AnyRef与AnyVal

AnyVal

所有数值类型的父类

AnyRef

所有对象类型(引用类型)的父类

Unit

表示空,Unit是AnyVal的子类,它只有一个的实例(),它类似于Java中的void,但scala要比Java更加面向对象

Null

Null是AnyRef的子类,也就是说它是所有引用类型的子类。它的实例是null, 可以将null赋值给任何对象类型

Nothing

所有类型的子类不能直接创建该类型实例,某个方法抛出异常时,返回的就是Nothing类型,因为Nothing是所有类的子类,那么它可以赋值为任何类型

6. scala中的条件表达式

条件表达式就是if表达式,if表达式可以根据给定的条件是否满足,根据条件的结果(真或假)决定执行对应的操作。scala条件表达式的语法和Java一样。

//定义变量x
scala> val x = 1
x: Int = 1

//if表达式
scala> val y =if(x>0) 1 else -1
y: Int = 1

//支持混合类型表达式
scala> val z = if(x>1) 1 else "error"
z: Any = error

//缺失else 相当于 if(x>2) 1 else ()
scala> val m = if(x>2) 1
m: AnyVal = ()

//scala中有个Unit类,用作不返回任何结果的方法的结果类型,相当于Java中的void,Unit只有一个实例值,写成()
scala> val n = if(x>2) 1 else ()
n: AnyVal = ()

//if(xx) else if(xx) else
scala> val k = if(x<0) -1 else if (x==0) 0 else 1
k: Int = 1

7. scala中的块表达式

定义变量时用 {} 包含一系列表达式,其中块的最后一个表达式的值就是块的值。如:

val x = 0 
val result = {
  val y = x+10
  val z = y+"-hello"  
  val m = z+"-scala"
  "over"
}

在scala解释器中先输入 :paste ,然后写多行代码, 之后按ctrl+d结束输入,如图:

8. 循环

在scala中,可以使用for和while,但一般推荐使用for表达式,因为for表达式语法更简洁。

8.1、for循环

(1)语法结构:

 (i <- 表达式/数组/集合){
    //表达式
}

  • 简单的for循环

//简单的for循环
scala> val nums = 1 to 10
nums: scala.collection.immutable.Range.Inclusive = Range(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)

scala> for(i <- nums) println(i)
1
2
3
4
5
6
7
8
9
10

  • 双重for循环

//双重for循环打印99乘法表

  for(i <- 1 to 9; j <- 1 to i){
      print(i + "*" + j + "=" + i*j + "\t")
       if(i==j){
         println()
      }    
  }
  

(2)守卫:在for表达式中可以添加if判断语句,这个if判断称为守卫。

 //语法结构
  for(i <- 表达式/数组/集合 if 表达式) {
      // 表达式
  }

(3)for推导式:在for循环体中,以yield表达式开始,这类循环能构建出一个新的集合,我们把这类循环称为推导式。

 // for推导式:for表达式中以yield开始,该for表达式会构建出一个集合
  val v = for(i <- 1 to 5) yield i * 10

8.2 while循环

scala中while循环和Java中是一致的

(1)语法结构

while(返回值为布尔类型的表达式){
    //表达式
}

9. 方法和函数

10.1 方法

(1)语法

def methodName (参数名:参数类型, 参数名:参数类型) : [return type] = {
    // 方法体:一系列的代码
}

  • 说明
    • 参数列表的参数类型不能省略
    • 返回值类型可以省略,由scala编译器自动推断;(如果定义递归方法必须指定返回值类型
    • 返回值可以不写return,默认就是{}块表达式的值;

scala> def m1(x: Int) : Int = {         #递归时返回值类型不可省略
     | if(x==1) 1
     | else x * m1(x - 1)
     | }
m1: (x: Int)Int

scala> m1(10)
res9: Int = 3628800

(2)方法的参数

  • 默认参数:

  在定义方法时可以给参数定义一个默认值。如:

//1. 定义一个计算两个值相加的方法,这两个值默认为0
//2. 调用该方法

scala> def add(x: Int = 0, y: Int = 0) = x + y
add: (x: Int, y: Int)Int

  • 带名参数:

在调用方法时,可以指定参数的名称来进行调用。如:

scala> add(y = 1)
res16: Int = 1

  • 变长参数

如果方法的参数是不固定的,可以定义一个方法的参数是变长参数。即:在参数类型后面加一个*号,表示参数可以是0个或者多个

其语法格式:
  def 方法名(参数名: 参数类型*): 返回值类型 = {
      方法体
  }

 scala> def add(num: Int*) = num.sum
  add: (num: Int*)Int
  
  scala> add(1,2,3,4,5)
  res17: Int = 15

9.2 函数

(1)函数在scala中属于头等公民:

  • 数字能做的事,函数也可以;
  • 数字可以作为参数,所以函数也可以作为其他方法或函数的参数
  • 数字可以作为返回值,所以函数也可以作为其他方法或函数的返回值
  • 数字可以赋值给一个变量,所以函数也可以赋值给一个变量
  • scala支持函数式编程,将来编写Spark/Flink程序中,会大量使用到函数。

(2)语法

val 函数变量名 = (参数名:参数类型, 参数名:参数类型....) => 函数体

(3)注意:

  • 函数是一个对象(变量);
  • 类似于方法,函数也有输入参数和返回值;
  • 函数定义不需要使用def定义
  • 无需指定返回值类型
  • 一个函数没有赋予一个变量,则称为匿名函数,即:(x: Int, y: Int) => x + y
    (//实际开发代码,基本上都是使用匿名函数)

9.3 方法和函数的区别

  • 方法是隶属于类或者对象的,在运行时,它是加载到JVM的方法区中;
  • 可以将函数对象赋值给一个变量,在运行时,它是加载到JVM的堆内存中;
  • 函数是一个对象,继承自FunctionN,函数对象有apply,curried,toString,tupled这些方法,而方法则没有。

9.4 方法转换为函数

  • 有时候需要将方法转换为函数,作为变量传递,就需要将方法转换为函数;
  • 使用_即可将方法转换为函数。

如:

def add(x: Int,y: Int) = x + y
add: (x: Int, y: Int)Int

scala> val a = add _    #中间有个空格
a: (Int, Int) => Int = <function2>

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值