旨在帮助会这三门语言之一的程序员快速上手其他两种语言,我会在工作中逐渐增加、修缮这一份文档,能力不高,水平有限,难免有错误,请大家提 ISSUE 或者 PR 指正! 至于涉及到一些 Scala 中有但是 Java 中没有的骚操作,如果是在编译期间实现的(比如 implicit/mapReduce),我就不说明了,除非一些简单的(例如操作符重载)可能会说明一下。
平时主要接触的就这三个语言,写 Spark 用 Scala,写 Spring Boot 2 用 Kotlin,会这两门语言怎么能不会 Java 呢(傲娇脸)。 还有一些 JVM 平台下的其他优秀语言,也欢迎各位大神 PR。
| Java | Scala | Kotlin |
|---|---|---|
| int | Int | Int |
| double | Double | Double |
| long | Long | Long |
| float | Float | Float |
| String | String | String |
说明: Java 的类型有对应的 Object 的版本(例如longMovidius->Long),在 Scala 下,转换的方式为:
x.asInstanceOf[AnyRef]
如果类型已经知道也可以使用比较地味一点的办法:
java.lang.Long.valueOf(x)
| 项目\语言 | Java | Scala | Kotlin |
|---|---|---|---|
| 类型表征 | T[] | Array[T] | Array |
| 初始化 | new T[]{a,b,c,d} | Array(a,b,c,d) | arrayOf(a,b,c,d) |
说明: Scala 和 Kotlin 中有类型自动推导,不一定要严格的说明类型
Java
Map<A,B> m = new HashMap<A,B>()
m.put(key1,value1)
m.put(key2,value2)
Scala
val m = Map[A,B]("x"->1,"y"->2)
Kotlin
val m = mapOf("x" to 1,"y" to 2)
// 只针对Java 8
data.forEach((k,v)->{
//your function process k,v
})
// 如果你还在用Java 7什么的:
for(Map.Entry<K,V> entry:data.entrySet()){
//your function process entry
}
Scala
data.foreach(kv=>{
val key = kv._1
val value = kv._2
//your function process key and value
})
Kotlin
data.forEach { t, u ->
// your function process t and u
}
Scala 的 Map 有 mutable 和 immutable 之分,immutable 的 Map(默认就是 immutable)不能再加入内容,如果需要初始化一个可以加入内容的 Map 需要使用scala.collection.mutable中的类型。
Iterable 的意思是可循环的,其中 Java 8 在引入 Lambda 表达式之后画风变得奇怪了,而且 mapReduce 之类的操作也好像不是那么回事儿(先要stream()一个),我会单独列出说明:
Java
// 只针对Java 8
data.stream().map(x->{
//your function process x
})
// 如果你还在用Java 7什么的:
List<Y> yList = new ArrayList<Y>();
for(X x:data){
// process x to y
yList.add(y);
}
Scala
data.map(x=>{
//your function process x
})
Kotlin
data.map {
//your function process `it`
}
需要说明的是,Kotlin中匿名函数的写法和两者都不太一样,默认以it作为传入参数,一般也就这么处理。
Java
// 只针对Java 8
data.stream().reduce((a,b)->{
//your function process a,b
})
// 如果你还在用Java 7什么的:
// 算了还是洗洗睡吧
Scala
data.reduce((a,b)=>{
// 处理你的a和b
})
需要说明的是,Scala支持匿名变量,例如:
data.reduce((a,b)=>a+b)
可以写作
data.reduce( _ + _ )
第一个_代表第一个变量,第二个_代表第二个变量。
Kotlin
data.reduce {
a,b -> // 处理你的a和b
}
