带你快速掌握Scala操作———(2)

2021-04-13 11:03:57 浏览数 (1)

继续上一篇《Scala基础操作(1)———Scala解释器,声明变量,字符串》给大家接着分享下面的操作!!!!!!

1、数据类型与操作符

代码语言:javascript复制
scala中的类型以及操作符绝大多数和Java一样
数据类型

基础类型

类型说明

Byte

8位带符号整数

Short

16位带符号整数

Int

32位带符号整数

注意下 scala类型与Java的区别

代码语言:javascript复制
1.	scala中所有的类型都使用大写字母开头
2.	整形使用Int而不是Integer
3.	scala中定义变量可以不写类型,让scala编译器自动推断
运算符
代码语言:javascript复制
	scala中没有,  、--运算符
	与Java不一样,在scala中,可以直接使用==、!=进行比较,它们与equals方法表示一致。而比较两个对象的引用值,使用eq

示例

代码语言:javascript复制
有一个字符串"abc",再创建第二个字符串,值为:在第一个字符串后拼接一个空字符串。
然后使用比较这两个字符串是否相等、再查看它们的引用值是否相等。

参考代码

代码语言:javascript复制
val str1 = "abc"
val str2 = str1   ""
str1 == str2
str1.eq(str2)
scala类型层次结构

nothing

代码语言:javascript复制
def main(args: Array[String]): Unit = {
    val c = m3(1,0)
}

def m3(x:Int, y:Int):Int = {
    if(y == 0) throw new Exception("这是一个异常")
    x / y
}

问题

以下代码是否有问题?

代码语言:javascript复制
val b:Int = null

scala会解释报错:

代码语言:javascript复制
Null类型并不能转换为Int类型,说明Null类型并不是Int类型的子类	

2、条件表达式

代码语言:javascript复制
条件表达式就是if表达式。scala条件表达式的语法和Java一样。
有返回值的if

参考代码

代码语言:javascript复制
scala> val sex = "male"
sex: String = male

scala> val result = if(sex == "male") 1 else 0
result: Int = 1
代码语言:javascript复制
与Java不一样的是,
	在scala中,条件表达式也是有返回值的
	在scala中,没有三元表达式,可以使用if表达式替代三元表达式
块表达式
代码语言:javascript复制
	scala中,使用{}表示一个块表达式
	和if表达式一样,块表达式也是有值的
	值就是最后一个表达式的值
代码语言:javascript复制
问题
请问以下代码,变量a的值是什么?
代码语言:javascript复制
scala> val a = {
    | println("1   1")
    | 1   1
    | }

3、循环

代码语言:javascript复制
在scala中,可以使用for和while,但一般推荐使用for表达式,因为for表达式语法更简洁
for表达式

语法

代码语言:javascript复制
for(i <- 表达式/数组/集合) {
    // 表达式
}

简单循环

使用for表达式打印1-10的数字

参考代码1

代码语言:javascript复制
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)      

参考代码2

// 中缀调用法

代码语言:javascript复制
scala> for(i <- 1 to 10) println(i)

嵌套循环

使用for表达式,打印以下字符

*****

*****

*****

参考代码

代码语言:javascript复制
for(i <- 1 to 3; j <- 1 to 5) {print("*");if(j == 5) println("")}

守卫

代码语言:javascript复制
for表达式中,可以添加if判断语句,这个if判断就称之为守卫。我们可以使用守卫让for表达式更简洁。

语法

代码语言:javascript复制
for(i <- 表达式/数组/集合 if 表达式) {
    // 表达式
}

示例

代码语言:javascript复制
使用for表达式打印1-10之间能够整除3的数字
参考代码
// 添加守卫,打印能够整除3的数字
for(i <- 1 to 10 if i % 3 == 0) println(i)
for推导式
代码语言:javascript复制
在for循环体中,可以使用yield表达式构建出一个集合,我们把使用yield的for表达式称之为推导式

示例

代码语言:javascript复制
生成一个10、20、30...100的集合

参考代码

代码语言:javascript复制
// for推导式:for表达式中以yield开始,该for表达式会构建出一个集合
val v = for(i <- 1 to 10) yield i * 10
while循环
代码语言:javascript复制
scala中while循环和Java中是一致的

示例

代码语言:javascript复制
打印1-10的数字

参考代码

代码语言:javascript复制
scala> var i = 1
i: Int = 1

scala> while(i <= 10) {
     | println(i)
     | i = i 1
     | }
break和continue
代码语言:javascript复制
	scala中,没有break/continue关键字
	如果一定要使用break/continue,就需要使用scala.util.control包的Break类的breable和break方法。

实现break

用法

 导入Breaks包import scala.util.control.Breaks._

代码语言:javascript复制
	使用breakable将for表达式包起来
	for表达式中需要退出循环的地方,添加break()方法调用

示例

代码语言:javascript复制
使用for表达式打印1-100的数字,如果数字到达50,退出for表达式
参考代码
// 导入scala.util.control包下的Break
import scala.util.control.Breaks._
breakable{
    for(i <- 1 to 100) {
        if(i >= 50) break()
        else println(i)
    }
}

实现continue

用法

代码语言:javascript复制
continue的实现与break类似,但有一点不同:
实现continue是用breakable{}将for表达式的循环体包含起来

示例

代码语言:javascript复制
打印1-100的数字,使用for表达式来遍历,如果数字能整除10,不打印
// 导入scala.util.control包下的Break    
import scala.util.control.Breaks._
for(i <- 1 to 100 ) {
   breakable{
       if(i % 10 == 0) break()
       else println(i)
  }
}

4、方法

代码语言:javascript复制
一个类可以有自己的方法,scala中的方法和Java方法类似。但scala与Java定义方法的语法是不一样的。
定义方法

语法

代码语言:javascript复制
def methodName (参数名:参数类型, 参数名:参数类型) : [return type] = {
   // 方法体:一系列的代码
}
代码语言:javascript复制
	参数列表的参数类型不能省略
	返回值类型可以省略,由scala编译器自动推断
	返回值可以不写return,默认就是{}块表达式的值

示例

代码语言:javascript复制
1.	定义一个方法,实现两个整形数值相加,返回相加后的结果
2.	调用该方法

参考代码

代码语言:javascript复制
scala> def add(a:Int, b:Int) = a   b
m1: (x: Int, y: Int)Int

scala> add(1,2)
res10: Int = 3
返回值类型推断
代码语言:javascript复制
scala定义方法可以省略返回值,由scala自动推断返回值类型。
定义递归方法,不能省略返回值类型

示例

代码语言:javascript复制
定义递归方法(求阶乘)
10 * 9 * 8 * 7 * 6 * ... * 1

参考代码

代码语言:javascript复制
scala> def m2(x:Int) = {
     | if(x<=1) 1
     | else m2(x-1) * x
     | }
<console>:13: error: recursive method m2 needs result type
       else m2(x-1) * x
方法参数

scala中的方法参数,使用比较灵活。它支持以下几种类型的参数:

代码语言:javascript复制
•	默认参数
•	带名参数
•	变长参数

默认参数

代码语言:javascript复制
在定义方法时可以给参数定义一个默认值。

参考代码

代码语言:javascript复制
// x,y带有默认值为0 
def add(x:Int = 0, y:Int = 0) = x   y
add()

带名参数

代码语言:javascript复制
在调用方法时,可以指定参数的名称来进行调用。

参考代码

代码语言:javascript复制
def add(x:Int = 0, y:Int = 0) = x   y
add(x=1)

变长参数

代码语言:javascript复制
如果方法的参数是不固定的,可以定义一个方法的参数是变长参数。

语法格式:

代码语言:javascript复制
def 方法名(参数名:参数类型*):返回值类型 = {
    方法体
}
在参数类型后面加一个*号,表示参数可以是0个或者多个

参考代码

代码语言:javascript复制
scala> def add(num:Int*) = num.sum
add: (num: Int*)Int

scala> add(1,2,3,4,5)
res1: Int = 15
方法调用方式

在scala中,有以下几种方法调用方式,

代码语言:javascript复制
•	后缀调用法
•	中缀调用法
•	花括号调用法
•	无括号调用法

在后续编写spark、flink程序时,我们会使用到这些方法调用方式。

后缀调用法

代码语言:javascript复制
这种方法与Java没有区别。

语法

代码语言:javascript复制
对象名.方法名(参数)

示例

代码语言:javascript复制
使用后缀法Math.abs求绝对值

参考代码

代码语言:javascript复制
scala> Math.abs(-1)
res3: Int = 1

中缀调用法

代码语言:javascript复制
语法 注意空格

对象名 方法名 参数
代码语言:javascript复制
例如:1 to 10
如果有多个参数,使用括号括起来

示例

代码语言:javascript复制
使用中缀法Math.abs求绝对值
scala> Math abs -1
res4: Int = 1

操作符即方法

代码语言:javascript复制
scala中,  - * / %等操作符都是方法,操作符是一个方法名字是符号的方法。

花括号调用法

语法

代码语言:javascript复制
Math.abs{ 
    // 表达式1
    // 表达式2
}
方法只有一个参数,才能使用花括号调用法

示例

代码语言:javascript复制
使用花括号调用法Math.abs求绝对值
参考代码
scala> Math.abs{-10}
res13: Int = 10

无括号调用法

代码语言:javascript复制
如果方法没有参数,可以省略方法名后面的括号

示例

代码语言:javascript复制
	定义一个无参数的方法,打印"hello"
	使用无括号调用法调用该方法

参考代码

代码语言:javascript复制
def m3()=println("hello")
m3()

喜欢点个关注吧 后续还会继续分享Scala操作的!!!11

0 人点赞