很多刚学Scala的朋友一看到Java类库就犯怵,以为得重写一套——其实完全没必要。Scala和Java跑在同一个JVM上,天然互通,调用Java代码就像调自己写的函数一样自然。
直接new一个Java对象
比如你想用Java的ArrayList,不用改任何配置,直接写:
import java.util.ArrayList
val list = new ArrayList[String]()
list.add("苹果")
list.add("香蕉")
println(list.get(0)) // 输出:苹果注意:Scala里没有分号,import写在文件顶部就行,new关键字不能省。
调用Java静态方法也很简单
比如想用java.lang.Math里的max方法:
import java.lang.Math
val bigger = Math.max(15, 8)
println(bigger) // 输出:15Java的静态工具类,在Scala里照搬照用,连包名都不用缩写。
处理Java的getter/setter
Java Bean习惯用getXXX()和setXXX(),Scala会自动帮你“翻译”成点号访问。比如有个Java类:
public class Person {
private String name;
public String getName() { return name; }
public void setName(String name) { this.name = name; }
}在Scala里可以这样用:
val p = new Person()
p.name = "小王" // 自动转成 setName("小王")
println(p.name) // 自动转成 getName()这个特性叫“Bean属性映射”,默认开启,不用额外配置。
注意几个小坑
• Java的void方法在Scala里返回Unit(类似空括号()),别拿它当值用;
• Java数组要写成Array[String]这种形式,但底层还是String[];
• 如果Java方法参数是泛型通配符(比如List<? extends Number>),Scala里用List[_ <: Number]来对应。
举个实战例子:用Java的SimpleDateFormat格式化时间,这在Scala标准库里没直接替代品:
import java.text.SimpleDateFormat
import java.util.Date
val sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm")
val now = new Date()
println(sdf.format(now)) // 输出类似:2024-06-12 14:30你看,没加插件、不改构建脚本、不装额外依赖,编译就能过,运行就生效。