Scala 语法入门

news/2025/2/9 6:21:27 标签: scala, 开发语言, 大数据

Scala语法入门

    • 1. 定义变量
    • 2. 定义方法
    • 3. 闭包
    • 4. 声明字符串
    • 5. 声明数组
    • 6. 声明集合
    • 7. 异常处理

1. 定义变量

(变量的类型在变量名之后等号之前声明)

  • 不可变变量(val)
    类似于 Java 中的 final 变量,即一旦赋值后,其值不能再被改变。
    scala">val myVal : String = "Foo"
    
  • 可变变量(var)
    类似于 Java 中的普通变量,其值可以在程序的生命周期内多次改变。
    scala">var myVar : String = "Foo"
    

在 Scala 中声明变量和常量不一定要指明数据类型,在没有指明数据类型的情况下,其数据类型是通过变量或常量的初始值推断出来的。
所以,如果在没有指明数据类型的情况下声明变量或常量必须要给出其初始值,否则将会报错。

scala">val inferredInt = 42  // 编译器推断为 Int
val inferredDouble = 3.14  // 编译器推断为 Double
val inferredString = "Hello, Scala!"  // 编译器推断为 String
val inferredBoolean = true  // 编译器推断为 Boolean
  • 多个变量声明
    Scala 中,可以使用逗号分隔、元组解构和 for 推导式等方法同时声明多个变量。
    • 逗号分隔
      scala">val a, b, c: Int = 5
      var x, y, z: Int = 10
      
    • for 推导式
      scala">object ForComprehension {
        def main(args: Array[String]): Unit = {
          // 同时声明多个变量用于迭代
          val numbers = List((1, "one"), (2, "two"), (3, "three"))
          for ((number, word) <- numbers) {
            println(s"Number: $number, Word: $word")
          }
      
          // 使用 for 推导式生成新集合
          val newNumbers = for {
            (number, word) <- numbers
          } yield (number * 2, word.toUpperCase)
      
          println(s"New Numbers: $newNumbers")
        }
      }
      

2. 定义方法

格式

def functionName ([参数列表]) : [return type] = {
   function body
   return [expr]
}

案例

scala">object add{
   def addInt( a:Int, b:Int ) : Int = {
      var sum:Int = 0
      sum = a + b

      return sum
   }
}

如果方法没有返回值,可以返回为 Unit,类似于 Java 的 void。

(定义函数,也可认为方法和函数没区别)

scala">class Test{
  def m(x: Int) = x + 3
  val f = (x: Int) => x + 3
}

3. 闭包

闭包 是指 一个函数可以捕获外部变量,并在其作用域之外仍然可以使用这些变量。
简单形式

scala">object ClosureExample1 {
  def main(args: Array[String]): Unit = {
    var externalVar = 10

    val closure = (x: Int) => x + externalVar

    println(closure(5))  // 输出 15

    externalVar = 20

    println(closure(5))  // 输出 25
  }
}

复杂形式:闭包作为返回值

scala">object ClosureExample2 {
  def main(args: Array[String]): Unit = {
    def makeAdder(adder: Int): Int => Int = {
      (x: Int) => x + adder
    }

    val addFive = makeAdder(5)
    val addTen = makeAdder(10)

    println(addFive(3))  // 输出 8
    println(addTen(3))   // 输出 13
  }
}

详细解释
makeAdder 是一个 高阶函数,它接收一个整数 adder,返回一个 函数。
返回值类型:Int => Int(表示返回一个 输入 Int,返回 Int 的函数)。
返回的函数 (x: Int) => x + adder:

  • 这是一个 匿名函数(Lambda 表达式)。

执行过程总结

步骤代码解释
makeAdder(5)adder = 5,返回 (x: Int) => x + 5
val addFive = makeAdder(5)addFive 现在是 (x: Int) => x + 5
println(addFive(3))3 + 5 = 8,输出 8

闭包与函数式编程
闭包在函数式编程中是一个重要的概念,广泛用于高阶函数、柯里化等技术中。
以下实例,highOrderFunction 函数接受一个函数作为参数。传递的闭包捕获了外部变量 externalVar。

scala">object ClosureExample4 {
  def main(args: Array[String]): Unit = {
    def highOrderFunction(f: Int => Int, x: Int): Int = f(x)

    val externalVar = 5
    val closure = (x: Int) => x + externalVar

    println(highOrderFunction(closure, 10))  // 输出 15
  }
}

4. 声明字符串

scala">val s = "Hello World!";val s:String = "Hello World!";

5. 声明数组

scala">var arr:Array[String] = new Array[String](3)var arr = new Array[String](3)var arr = Array("Runoob", "Baidu", "Google")

为数组元素赋值

scala">arr(0) = "Runoob"

6. 声明集合

scala">// 定义整型 List
val x = List(1,2,3,4)

// 定义 Set
val x = Set(1,3,5,7)

// 定义 Map
val x = Map("one" -> 1, "two" -> 2, "three" -> 3)

// 创建两个不同类型元素的元组
val x = (10, "Runoob")

// 定义 Option
val x:Option[Int] = Some(5)

7. 异常处理

scala">import java.io.FileReader
import java.io.FileNotFoundException
import java.io.IOException

object Test {
   def main(args: Array[String]) {
      try {
         val f = new FileReader("input.txt")
      } catch {
         case ex: FileNotFoundException => {
            println("Missing file exception")
         }
         case ex: IOException => {
            println("IO Exception")
         }
      } finally {
         println("Exiting finally...")
      }
   }
}

over~

http://www.niftyadmin.cn/n/5845693.html

相关文章

C# OpenCV机器视觉:智能水果采摘

在一个风景如画的小镇边上&#xff0c;有一座阿强家祖传的果园。每到水果成熟的季节&#xff0c;果园里硕果累累&#xff0c;红彤彤的苹果、黄澄澄的梨子、紫莹莹的葡萄&#xff0c;散发着诱人的香气。然而&#xff0c;这丰收的喜悦却总被一件烦心事笼罩 —— 摘水果。 “哎呀…

5分钟了解回归测试

1. 什么是回归测试&#xff08;Regression Testing&#xff09; 回归测试是一个系统的质量控制过程&#xff0c;用于验证最近对软件的更改或更新是否无意中引入了新错误或对以前的功能方面产生了负面影响&#xff08;比如你在家中安装了新的空调系统&#xff0c;发现虽然新的空…

深入探究 C++17 std::is_invocable

文章目录 一、引言二、std::is_invocable 概述代码示例输出结果 三、std::is_invocable 的工作原理简化实现示例 四、std::is_invocable 的相关变体1. std::is_invocable_r2. std::is_nothrow_invocable 和 std::is_nothrow_invocable_r 五、使用场景1. 模板元编程2. 泛型算法 …

陶氏环面包络减速机:为工业视觉检测注入“精准动力”!

在工业4.0时代&#xff0c;视觉检测技术已成为智能制造的核心环节。无论是精密电子元件的检测&#xff0c;还是汽车零部件的质量把控&#xff0c;视觉检测系统都需要极高的精度、稳定性和响应速度。而这一切&#xff0c;离不开一颗强大的“心脏”——陶氏环面包络减速机。 一、…

linux安装oracle19c

安装 安装前检查配置&#xff1a; 挂载50g盘&#xff1a; vgcreate oravg /dev/sdb lvcreate -L 49.8G -n oralv oravg lvscan mkfs.xfs /dev/oravg/oralv 查看uuid blkid 复制分区表 cp /etc/fstab /etc/fstab.bakvi /etc/fstab内容为: /dev/oravg/oralv /u01 xfs defau…

Docker 容器 Elasticsearch 启动失败完整排查记录

背景 在服务器上运行 Docker 容器 es3&#xff0c;但 Elasticsearch 无法正常启动&#xff0c;运行 docker ps -a 发现 es3 处于 Exited (1) 状态&#xff0c;即进程异常退出。 本次排查从错误日志、容器挂载、权限问题、SELinux 影响、内核参数等多个方面入手&#xff0c;最…

webview_flutter的使用

目录 步骤示例代码 步骤 1.配置依赖。根目录下运行如下命令&#xff1a; flutter pub add webview_flutter 2.所需页面导入&#xff1a; import ‘package:webview_flutter/webview_flutter.dart’; 3.初始化WebViewController overridevoid initState() {super.initState();…

Verilog代码实例

Verilog语言学习&#xff01; 文章目录 目录 文章目录 前言 一、基本逻辑门代码设计和仿真 1.1 反相器 1.2 与非门 1.3 四位与非门 二、组合逻辑代码设计和仿真 2.1 二选一逻辑 2.2 case语句实现多路选择逻辑 2.3 补码转换 2.4 7段数码管译码器 三、时序逻辑代码设计和仿真 3.1…