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的极简语法速查表,以后写代码直接对照着用吗?