Scala 运算符
Scala 提供了丰富的运算符,包括算术运算符、关系运算符、逻辑运算符等。在 Scala 中,运算符实际上是方法的语法糖。
算术运算符
scala
object ArithmeticOperators {
def main(args: Array[String]): Unit = {
val a = 10
val b = 3
println(s"a + b = ${a + b}") // 加法:13
println(s"a - b = ${a - b}") // 减法:7
println(s"a * b = ${a * b}") // 乘法:30
println(s"a / b = ${a / b}") // 除法:3
println(s"a % b = ${a % b}") // 取模:1
// 浮点数运算
val x = 10.0
val y = 3.0
println(s"x / y = ${x / y}") // 3.3333333333333335
}
}关系运算符
scala
object RelationalOperators {
def main(args: Array[String]): Unit = {
val a = 10
val b = 20
println(s"a == b: ${a == b}") // 等于:false
println(s"a != b: ${a != b}") // 不等于:true
println(s"a > b: ${a > b}") // 大于:false
println(s"a < b: ${a < b}") // 小于:true
println(s"a >= b: ${a >= b}") // 大于等于:false
println(s"a <= b: ${a <= b}") // 小于等于:true
}
}逻辑运算符
scala
object LogicalOperators {
def main(args: Array[String]): Unit = {
val a = true
val b = false
println(s"a && b: ${a && b}") // 逻辑与:false
println(s"a || b: ${a || b}") // 逻辑或:true
println(s"!a: ${!a}") // 逻辑非:false
// 短路求值
val x = 5
val result1 = x > 0 && x < 10 // true
val result2 = x < 0 || x > 3 // true
println(s"result1: $result1")
println(s"result2: $result2")
}
}位运算符
scala
object BitwiseOperators {
def main(args: Array[String]): Unit = {
val a = 12 // 二进制:1100
val b = 10 // 二进制:1010
println(s"a & b = ${a & b}") // 按位与:8 (1000)
println(s"a | b = ${a | b}") // 按位或:14 (1110)
println(s"a ^ b = ${a ^ b}") // 按位异或:6 (0110)
println(s"~a = ${~a}") // 按位取反:-13
println(s"a << 2 = ${a << 2}") // 左移:48 (110000)
println(s"a >> 2 = ${a >> 2}") // 右移:3 (11)
}
}赋值运算符
scala
object AssignmentOperators {
def main(args: Array[String]): Unit = {
var a = 10
a += 5 // a = a + 5
println(s"a += 5: $a") // 15
a -= 3 // a = a - 3
println(s"a -= 3: $a") // 12
a *= 2 // a = a * 2
println(s"a *= 2: $a") // 24
a /= 4 // a = a / 4
println(s"a /= 4: $a") // 6
a %= 4 // a = a % 4
println(s"a %= 4: $a") // 2
}
}运算符优先级
Scala 运算符的优先级从高到低:
()[].!~一元+-*/%+-<<>>>>><<=>>===!=&^|&&||=+=-=等赋值运算符
scala
object OperatorPrecedence {
def main(args: Array[String]): Unit = {
val result1 = 2 + 3 * 4 // 14 (不是 20)
val result2 = (2 + 3) * 4 // 20
val result3 = 10 > 5 && 3 < 8 // true
println(s"2 + 3 * 4 = $result1")
println(s"(2 + 3) * 4 = $result2")
println(s"10 > 5 && 3 < 8 = $result3")
}
}自定义运算符
在 Scala 中,可以定义自定义运算符:
scala
class Vector2D(val x: Double, val y: Double) {
// 定义 + 运算符
def +(other: Vector2D): Vector2D = {
new Vector2D(x + other.x, y + other.y)
}
// 定义 * 运算符(标量乘法)
def *(scalar: Double): Vector2D = {
new Vector2D(x * scalar, y * scalar)
}
// 定义自定义运算符
def ++(other: Vector2D): Vector2D = {
new Vector2D(x + other.x * 2, y + other.y * 2)
}
override def toString: String = s"Vector2D($x, $y)"
}
object CustomOperators {
def main(args: Array[String]): Unit = {
val v1 = new Vector2D(1.0, 2.0)
val v2 = new Vector2D(3.0, 4.0)
val sum = v1 + v2
val scaled = v1 * 2.0
val custom = v1 ++ v2
println(s"v1 + v2 = $sum") // Vector2D(4.0, 6.0)
println(s"v1 * 2.0 = $scaled") // Vector2D(2.0, 4.0)
println(s"v1 ++ v2 = $custom") // Vector2D(7.0, 10.0)
}
}运算符的方法调用形式
在 Scala 中,运算符实际上是方法调用的语法糖:
scala
object OperatorMethods {
def main(args: Array[String]): Unit = {
val a = 10
val b = 5
// 以下两种写法是等价的
println(a + b) // 运算符形式
println(a.+(b)) // 方法调用形式
println(a * b) // 运算符形式
println(a.*(b)) // 方法调用形式
// 字符串操作
val str1 = "Hello"
val str2 = "World"
println(str1 + " " + str2) // 运算符形式
println(str1.+(" ").+(str2)) // 方法调用形式
}
}特殊运算符
Option 类型的运算符
scala
object OptionOperators {
def main(args: Array[String]): Unit = {
val opt1: Option[Int] = Some(10)
val opt2: Option[Int] = None
// getOrElse 运算符
println(opt1.getOrElse(0)) // 10
println(opt2.getOrElse(0)) // 0
// map 运算符
val doubled = opt1.map(_ * 2)
println(doubled) // Some(20)
// flatMap 运算符
val result = opt1.flatMap(x => Some(x + 5))
println(result) // Some(15)
}
}集合运算符
scala
object CollectionOperators {
def main(args: Array[String]): Unit = {
val list1 = List(1, 2, 3)
val list2 = List(4, 5, 6)
// :: 运算符(cons)
val newList = 0 :: list1
println(newList) // List(0, 1, 2, 3)
// ::: 运算符(连接)
val combined = list1 ::: list2
println(combined) // List(1, 2, 3, 4, 5, 6)
// ++ 运算符(连接)
val concatenated = list1 ++ list2
println(concatenated) // List(1, 2, 3, 4, 5, 6)
}
}实践练习
- 创建一个计算器类,实现基本的四则运算
- 定义一个复数类,实现复数的加法和乘法运算符
- 使用位运算符实现简单的权限系统
scala
// 练习1:计算器类
class Calculator {
def add(a: Double, b: Double): Double = a + b
def subtract(a: Double, b: Double): Double = a - b
def multiply(a: Double, b: Double): Double = a * b
def divide(a: Double, b: Double): Double = {
if (b != 0) a / b
else throw new IllegalArgumentException("Division by zero")
}
}
// 练习2:复数类
class Complex(val real: Double, val imaginary: Double) {
def +(other: Complex): Complex = {
new Complex(real + other.real, imaginary + other.imaginary)
}
def *(other: Complex): Complex = {
val newReal = real * other.real - imaginary * other.imaginary
val newImaginary = real * other.imaginary + imaginary * other.real
new Complex(newReal, newImaginary)
}
override def toString: String = {
if (imaginary >= 0) s"$real + ${imaginary}i"
else s"$real - ${-imaginary}i"
}
}
// 练习3:权限系统
object PermissionSystem {
val READ = 1 // 001
val WRITE = 2 // 010
val EXECUTE = 4 // 100
def hasPermission(userPermissions: Int, requiredPermission: Int): Boolean = {
(userPermissions & requiredPermission) == requiredPermission
}
def addPermission(userPermissions: Int, newPermission: Int): Int = {
userPermissions | newPermission
}
def removePermission(userPermissions: Int, permissionToRemove: Int): Int = {
userPermissions & ~permissionToRemove
}
}运算符是 Scala 编程的基础,掌握它们的使用对于编写高效、可读的代码非常重要。