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 提供了 tountil 操作符来表示范围。

    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):

  1. 定义: 方法是属于类或对象的成员,它在类或对象的作用域内声明。

  2. 调用: 方法通过对象实例或类名(如果是静态方法)调用。

  3. 参数: 方法可以接受参数,也可以没有参数。

  4. 特征: 方法可以有访问修饰符(public、private 等)、返回类型,也可以包含其他语法结构,如条件语句、循环等。

    class MyClass { def add(x: Int, y: Int): Int = { x + y } } val myObject = new MyClass() val result = myObject.add(3, 5)

     

函数(Function):

  1. 定义: 函数是一等公民,可以独立存在,不需要依赖于类或对象。在 Scala 中,函数可以被直接定义和传递。

  2. 调用: 函数可以直接调用,也可以传递给其他函数。

  3. 参数: 函数可以接受参数,也可以没有参数。

  4. 特征: 函数是具有类型的值,可以被存储在变量中,也可以作为参数传递给其他函数。

     
    // 函数字面量 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}
  }
}

这样就把函数变为可以赋值的变量,不同于传统变量的类型定义,函数的类型定义为[(参数类型) => 返回值类型]这种形式确定

 

posted @ 2024-01-19 23:26  突破铁皮  阅读(5)  评论(0编辑  收藏  举报