继续上一篇《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._
使用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