Scala的基础知识
Scala的数据类型
在scala中没有基本数据类型的概念,scala的所有数据类型都是引用数据类型
九大基本类型:
数值类型:
-
Byte: 8 位有符号整数,范围为 -128 到 127。
-
Short: 16 位有符号整数,范围为 -32768 到 32767。
-
Int: 32 位有符号整数,范围为 -2147483648 到 2147483647。
-
Long: 64 位有符号整数,范围为 -9223372036854775808 到 9223372036854775807。
-
Float: 32 位浮点数。
-
Double: 64 位浮点数。
字符类型:
- Char: 16 位 Unicode 字符。
布尔类型:
- Boolean: 布尔类型,值为 true 或 false。
单位类型:
- Unit: 表示无值,类似于其他语言中的
void
。在函数没有返回值时使用。
引用类型:
-
String(字符串): 由字符组成的字符串。
-
Array(数组): 有序集合,包含相同类型的元素。
-
List(列表): 不可变链表,可以包含不同类型的元素。
-
Set(集合): 无序集合,不包含重复元素。
-
Map(映射): 键值对的集合。
-
Tuple(元组): 有序的不同类型元素的集合。
变量声明
val:不可变变量,相当于final修饰
var:可变变量
在scala中,泛型修饰位于变量名之后,scala中所有的变量都是弱类型,在定义时可以不用显示定义变量类型
操作符
操作符大部分和Java一致
差异:
自增自减:
scala中没有自增自减运算符
范围操作符:
-
Java: Java 中没有直接的范围操作符,通常使用循环来表示范围。
-
Scala: Scala 提供了
to
和until
操作符来表示范围。val range1 = 1 to 5 // 包括5 val range2 = 1 until 5 // 不包括5
Null 安全操作符:
-
Java: Java 中使用条件语句来检查空引用。
-
Scala: Scala 提供了
Option
类型和getOrElse
方法来处理空引用。val result: Option[String] = Option(maybeNullString)
val value: String = result.getOrElse("default")
三元运算符:
-
Java: Java 中有三元运算符
? :
。 -
Scala: Scala 也有三元运算符
if-else
。val result = if (condition) "trueValue" else "falseValue"
for循环的特点
import scala.util.control.Breaks
object Main {
def main(args: Array[String]): Unit = {
//集合的遍历,i <- 集合
// to确定区间
for (i <- 1 to 10 ) { println(i) } // 1,2,3,4,5,6,7,8,9,10
//util确定区间
for (i <- 1 until 10){ println(i) } // 1,2,3,4,5,6,7,8,9
//步长写法1
for (i <- 1 to (10,2)) println(i) // 1,3,5,7,9
//步长写法2
for (i <- 1 to 10 by 2) println(i) // 1,3,5,7,9
//嵌套循环
for (i <- 1 to 10 ; j <- 1 to i) println(i,j) // (1,1)(2,1)(2,2)(3,1)(3,2)(3,3)(4,1)(4,2)(4,3)(4,4)(5,1)(5,2)(5,3)(5,4)(5,5)(6,1)(6,2)(6,3)(6,4)(6,5)(6,6)(7,1)(7,2)(7,3)(7,4)(7,5)(7,6)(7,7)(8,1)(8,2)(8,3)(8,4)(8,5)(8,6)(8,7)(8,8)(9,1)(9,2)(9,3)(9,4)(9,5)(9,6)(9,7)(9,8)(9,9)(10,1)(10,2)(10,3)(10,4)(10,5)(10,6)(10,7)(10,8)(10,9)(10,10)
//循环守卫
for (i <- 1 to 10 if (i%2==0)) println(i) // 2,4,6,8,10
//scala没有break和continue关键字,采用if进行跳过,Breaks类进行跳出
Breaks.breakable(for (i <- 1 to 10 ) { if(i>5) {Breaks.break()} ; println(i) }) // 1,2,3,4,5
}
}
yield关键字
yield
是 Scala 编程语言中用于在 for
循环中生成新集合的关键字。通过在 for
循环中使用 yield
,可以将每次循环迭代的结果收集起来,形成一个新的集合。这提供了一种简洁而强大的方法,用于对原始集合进行转换、筛选和映射操作。yield
的使用增加了 Scala 中函数式编程风格的灵活性,使得在处理集合时可以更加直观和表达力强。
val arr = for ( i <- 1 to 10 ) yield i*2
for ( i <- arr ) {
println(i)
}
// 2,4,6,8,10,12,14,16,18,20
方法和函数
在 Scala 中,方法(Method)和函数(Function)是两个相关但有区别的概念。
方法(Method):
-
定义: 方法是属于类或对象的成员,它在类或对象的作用域内声明。
-
调用: 方法通过对象实例或类名(如果是静态方法)调用。
-
参数: 方法可以接受参数,也可以没有参数。
-
特征: 方法可以有访问修饰符(public、private 等)、返回类型,也可以包含其他语法结构,如条件语句、循环等。
class MyClass { def add(x: Int, y: Int): Int = { x + y } } val myObject = new MyClass() val result = myObject.add(3, 5)
函数(Function):
-
定义: 函数是一等公民,可以独立存在,不需要依赖于类或对象。在 Scala 中,函数可以被直接定义和传递。
-
调用: 函数可以直接调用,也可以传递给其他函数。
-
参数: 函数可以接受参数,也可以没有参数。
-
特征: 函数是具有类型的值,可以被存储在变量中,也可以作为参数传递给其他函数。
// 函数字面量 val addFunction: (Int, Int) => Int = (x, y) => x + y
// 调用函数 val result = addFunction(3, 5)
scala的方法格式
def 方法名(args:类型):返回值类型={}
在scala中如果没有return,则返回最后一行的语句返回值
在scala中万物皆是方法(包括操作符)
1+2和1.+(2)是等价的,推广的话对于a.method(b)可以写为a method b,如果是多个参数的话括号不可省略,如果无参数的话则可以直接写 a method
def method(agrs*),在参数尾部加上*该参数就变为可变参数,可以从接受任意个同类型的实参
scala的函数格式
val/var [ 函数名: (参数类型) => 返回值类型 ] = [ (参数列表) => {函数体,返回值类型和定义一致} ]
var fun:(Int,Int) => Int = (x,y) => {val c=x+y;c*2}
println(fun (20,10)) //60
// (Int,Int) => Int 为函数的类型,可以传递所有同类型的函数实参
fun= (a,b) => { a*b }
println(fun (20,10)) //200
这里函数不同于方法,是一个确实存在的值,和那些变量一样,无需进行调用也可以,而方法则必须得调用,类似于函数指针,因此函数也能弄作为返回值
def main(args: Array[String]): Unit = {
val add1=add(20,1)
val add2=add(10,1)
println(add1 (2,3)) // 5
println(add2 (2,3)) // 6
}
def add(x:Int,y:Int) : (Int,Int) => Int = {
if(x>10){
return {(x,y) => x+y}
}
else {
return {(x,y) => x*y}
}
}
这样就把函数变为可以赋值的变量,不同于传统变量的类型定义,函数的类型定义为[(参数类型) => 返回值类型]这种形式确定