写点什么

Java 转 Kotlin 原来如此简单

作者:Silently9527
  • 2024-09-06
    四川
  • 本文字数:2097 字

    阅读完需:约 7 分钟

Java转Kotlin原来如此简单

程序员常用的 IDEA 插件:https://github.com/silently9527/Toolkit

微信公众号:贝塔学 Java

变量

Kotlin 声明变量的关键字有两个


  • val: 不可变引用,相当于 java 中 final 修饰的变量

  • var: 可变引用


举例:


val name:String = "Herman";val age = 20;
复制代码


在这个例子中,变量 name 明确指定了类型是 String,变量 age 没有指定类型,这两种方式都正确,Kotlin 的编译器可以根据初始化的值推断出 age 的类型,所以在定义变量的时候可以不用指定变量的类型


再看下面这个例子:


val age = 20age = “Herman”
复制代码


这里存在两个问题导致编译不通过:第一,由于变量会被改变,需要改成 var;第二,在第一次赋值的时候编译器推断出 age 的类型应该是 Int,在修改的是时候就不能被赋值 String

枚举

枚举的定义需要使用关键字 enum class, Kotlin 中的枚举和 Java 一样可以拥有属性和构造方法


enum class Color(val r: Int = 0, val g: Int = 0, val b: Int = 0) {    RED(255, 0, 0), GREEN(g = 255), BLUE(b = 255);
fun sum() = r + g + b
fun sum2(): Int { return r + g + b }}
复制代码


这里的枚举 Color 的构造方法有三个参数r,g,b,如果参数没有传默认是 0,然后再构建对象的时候可以指定变量的名字赋值(在后面类相关的部分会再次出现);


定义了两个方法 sum,两种写法都支持

when

when 语句类似于 Java 中的 switch 语句,但用法会更多一些


fun getWarmth(color: Color) =    when (color) {        Color.RED, Color.GREEN -> "warm"        Color.BLUE -> "cold"    }println(getWarmth(Color.BLUE))
复制代码


与 java 中的 switch 只能支持枚举,数字,字符串,而 when 支持任意类型


上面的例子还可以改写成不带参数的写法,这种写法每个分支条件就是布尔表达式(类似于 java 中的 if-elseif)


fun getWarmth(color: Color) =    when {        color == Color.RED || color == Color.GREEN -> "warm"        color == Color.BLUE -> "cold"        else -> throw IllegalArgumentException()    }
复制代码

迭代

while 的用法和 Java 相同


while(condition){
}
do{
}while(condition)
复制代码




在 Kotlin 中引入了区间,var oneToTen=1..10这个表示 1 到 10 的区间,这个区间是闭合的,也就是说包含 10


fun testFor() {    for (i in 1..10) {        print("$i,")    }}
复制代码



由于区间是闭合的, 包含了 10, 在实际情况下我们更常用是不包含, 可以使用until


fun testForUtil() {    for (i in 'A' until 'F') {        print("$i,")    }}
复制代码


输出结果: A,B,C,D,E,


上面的例子如果我们可以想要倒序输出,步长 2,可以是使用 downTo, step实现


fun testForDownTo() {    for (i in 10 downTo 1 step 2) {        print("$i,")    }}
复制代码





下面我们想要迭代一个 List, 同时还需要访问 List 的 index, for 循环改如何写


fun testForList() {    val list = listOf("Herman", "herman7z.site")    for ((index, value) in list.withIndex()) {        println("index:$index, value:$value")    }}
复制代码



迭代 map, 同时访问 key,value


fun testForMap() {    val map = TreeMap<Char, Int>();    for (i in 'A' until 'F') {        map[i] = i.code;    }
for ((key, value) in map) { println("key:$key, value:$value") }}
复制代码


in还可以用来判断元素在集合和区间是否存在,println(1 in 1..10)

异常处理

在 Java 中需要区分受检异常和不受检异常, 比如 IO 操作的方法通过都会抛出 IOException, 应用程序必须要处理,这导致了很多模式代码, 所以在 Kotlin 中不在区分受检异常和不受检异常,无需在方法后面 trhow 异常.


另外 try-catch 语句依然可以像 if-else 语句一样作为一个表达式, 最后一行就是表达式的返回值


fun testTryCatch() {    val result = try {        val i = 5 / 0;    } catch (e: Exception) {        0;    }
println(result)}
复制代码


上面的代码运行时遇到了异常进入到了 catch 分支, 最后一行是 0, 所以 result 的结果就是 0

字符串

在 Java 中我们想要使用字符串模版是通过 String.format 来实现,接下来看 Kotlin 如何的字符串模版


val name = "Herman"println("Hello, $name")
复制代码


从上面的我们可以看出 Kotlin 的模版确实要更简洁,直接使用$来引用变量,如果想要在模版中输出 $字符,需要使用转义:\$; 不仅如此,在模版中来可以写入一下逻辑判断


val age = 10;println("Hello, ${if(age>20) "Herman" else "Kotlin"}")
复制代码


在 Java 中的String.split方法的参数是正则表达式,所以在执行特殊的分隔符时主要转义, Kotlin 重载了这个方法


println("123.abc".split(".")) //这里的. 作为了普通字符串
复制代码


输出的结果


[1231, 12312]
复制代码


当我们需要使用正则表达式来分割是可以通过一下方式调用


println("123.abc".split("\\.".toRegex()))
复制代码


这里使用了双斜杠转义操作, 也可以是三重引号来去掉转义,看起来会更加直接


println("123.abc".split("""\.""".toRegex()))
复制代码


原文链接: http://herman7z.site

最后(看完不点关注,你们想白嫖我吗)

文中或许会存在或多或少的不足、错误之处,有建议或者意见也非常欢迎大家在评论交流。


最后,写作不易,请不要白嫖我哟,希望朋友们可以点赞评论关注三连,因为这些就是我分享的全部动力来源🙏

发布于: 刚刚阅读数: 4
用户头像

Silently9527

关注

公众号:贝塔学JAVA 2018-05-09 加入

Simple Programmer, Make the complex simple

评论

发布
暂无评论
Java转Kotlin原来如此简单_kotlin_Silently9527_InfoQ写作社区