Scala 10大特性 vs Java 对照


1. 样例类 Case Class

作用:一键生成实体类,自带构造、解构、equals、toString、序列化,专为模式匹配而生。

Scala

// 一行搞定数据实体
case class User(name: String, age: Int)

val u = User("张三", 20)
// 自动解构、直接取值
println(u.name, u.age)

Java 要手动写:私有成员、构造器、getter、toString、equals、hashCode,几十行模板代码。


2. 模式匹配 Match

作用:增强版 switch,能匹配值、类型、样例类、集合、解构,碾压 Java if-else/switch。

Scala

def check(x: Any) = x match {
    case 1 => "数字1"
    case s: String => s"字符串:$s"
    case User(n, a) => s"用户:$n,年龄$a"
    case _ => "其他"
}

Java 只能写 if (x instanceof String)、强转、逐个判断,极其啰嗦且不能解构对象。


3. 解构赋值

作用:把对象/元组/集合直接拆成变量。

Scala 元组解构

val (a, b) = (100, "Scala")
println(a)  // 100

Scala 样例类解构

val User(name, age) = User("李四", 25)

Java 无原生解构,只能逐个 get 赋值,没有语法层面支持。


4. 函数式编程(高阶函数 + 集合流式)

作用:函数是一等公民,可传参、可返回,集合极简处理。

Scala

val list = List(1,2,3,4)
// 一行:过滤、映射、求和
val res = list.filter(_ % 2 == 0).map(_ * 2).sum

Java 要用 Stream,但写法更繁琐,且不支持下划线简写、偏函数、柯里化。


5. 多继承特质 Trait

作用:Trait 可带字段+实现,类可以多继承多个 Trait,解决 Java 单继承痛点。

Scala

trait Run { def run(): Unit = println("跑起来") }
trait Swim { def swim(): Unit = println("游起来") }

class Animal extends Run with Swim

val a = new Animal
a.run()
a.swim()

Java 接口只能默认方法,不能有可变状态字段,多组合非常别扭。


6. 惰性求值 lazy val

作用:变量第一次使用时才初始化,延迟加载。

Scala

lazy val data = {
    println("耗时初始化...")
    999
}
println("先执行这句")
println(data) // 这里才执行初始化

Java 没有原生 lazy,只能手动写双重检查锁、静态内部类实现懒加载。


7. 隐式转换 & 隐式参数 implicit

作用:不修改源码,给已有类动态加方法;自动注入参数。

Scala 隐式扩展

// 给 String 新增一个方法
implicit class StringExt(s: String) {
    def double = s + s
}

println("abc".double) // abcabc

Java 只能写工具类、装饰器、适配器,语法层面无法无缝扩展。


8. 高级泛型:协变、逆变

作用:控制泛型父子类型兼容关系,Java 只有粗糙的 ? extends / ? super

Scala

// 协变 +
class List[+T]
// 逆变 -
class Action[-T]

含义:

  • +T:子类型泛型可以赋值给父类型
  • -T:反向兼容

Java 只能用通配符,语法晦涩、表达能力弱,不能在类定义上声明协变逆变。


9. 高阶类型

作用:类型本身也可以当参数,Java 完全不支持。

Scala

// M 是一个泛型容器类型,比如 List、Option
def foo[M[_], A](m: M[A]): Unit = {}

foo(List(1,2,3))
foo(Option(10))

Java 只能固定泛型,不能把“容器类型”当作参数传入,做不了高阶抽象。


10. 元编程(编译期宏)

作用:在编译阶段自动生成代码,不用手写重复模板。

Scala 示意(伪代码)

// 编译期自动为类生成 JSON 序列化方法
@generateJson
class User(name: String, age: Int)

Java 只能用 APT 注解处理器、字节码插桩,笨重、限制多、语法不友好。


总结一句话

Java 是够用、规矩、保守; Scala 多出来的这 10 个特性,本质是: 更简洁的语法 + 更强类型抽象 + 原生函数式 + 编译期编程 + 自由扩展能力

需要我给你整理一份 Java开发者快速上手Scala的极简语法速查表,以后写代码直接对照着用吗?