遇见 Kotlin 先导篇:Kotlin 相比 Java 好在哪里?

前言

Kotlin ——一种为现代多平台应用而诞生的静态编程语言

Kotlin 是由 JetBrains 开发的一个基于 JVM(Java虚拟机) 的新的编程语言。

Kotlin文件可以编译成Java的字节码,也可以编译成JavaScript,这样就很方便那些没有安装JVM的设备运行。

Kotlin兼容Java,相比于Java而言,它有很多优点,待会笔者会就几个写一下,并给出实际例子。

Kotlin文件以".kt"作为拓展名,这是Kotlin的官方参考文档。

在这笔者顺便打个广告

广告内容

腾讯课堂《跟鹅厂老司机学新技术》系列课程第一课 “遇见Kotlin” 将于今晚8点半开始啦

本期的主题为如何学习Kotlin和分享一些学习Kotlin过程的小技巧 ,欢迎各位开发者和小伙伴们前来围观哦

笔者是已经准备好凳子了的:) YingJoy

这是课程地址,还没报名的小伙伴们赶紧了!

广告结束。好了,现在开始正文

优点1. 与Java语言的互通性

Kotlin与Java100%互通,不通你打死我

你可以用Kotlin继续你的Java项目

所有你熟悉的Java框架仍可用。

任何框架,不管是 Kotlin 写的,还是你Java写的都可以。

Demo:

Kotlin调用Java

Java文件:
public class KotlinDemo {

    private String string;

    public KotlinDemo(String string) {
        this.string = string;
    }

    public void hello() {
        System.out.println("The string is " + string);
    }

    public String getString() {
        return string;
    }

    public void setString(String string) {
        this.string = string;
    }
		
		public boolean is(String string){
        return this.string.equals(string);
    }
}

Kotlin文件:
val kotlinDemo = KotlinDemo("Ying")
javaBean.hello()

javaBean.`is`("Joy")    //说明: is在Kotlin里是关键字,所以用``符号括起来

Java调用Kotlin

Kotlin文件:
class KotlinBeanDemo(val string: String) {
    fun hello() {
        println("The string is " + string)
    }
}

Java文件:
KotlinBeanDemo kdemo = new KotlinBeanDemo("Ying");
bean.hello();

优点2. 与Java语言的相似

这里可以看官方的文档

Demo

class Foo {

    val b: String = "a"
    var i: Int = 0

    fun hello() {
        val str = "Hello"
        print("$str World")
    }

    fun sum(x: Int, y: Int): Int {
        return x + y
    }

    fun maxOf(a: Float, b: Float) = if (a > b) a else b

}

在这里可以看到,Kotlin的每行代码结尾是可以不加“;”的,加了也没问题

优点2. 对字符串的操作

这里拿对字符串的插值来说

Demo

val x = 1
val y = 2
print("sum of $x and $y is ${x + y}")  //输出结果:sum of 1 and 2 is 3

在这里来说,Kotlin相当于有一个比Java中的字符串格式化函数(String.format())更加优秀的字符串函数

优点3. 类型判断与自动转换

Kotlin会根据代码逻辑对变量的类型进行推断

还会进行自动的类型转换

自动类型转换提高了代码的可读性,因为没有自动转换的话,需要人工进行转换,还会有很多instanceof进行检查

这里是官方文档

Demo

val a = "abc"                         // String
val b = 4                             // Int

val c: Double = 0.7                  //明确声明c为Double型
val d: List<String> = ArrayList()    //明确声明d为字符串型List

if (obj is String) {
    print(obj.toUpperCase())     // obj 不确定是否为String型
}

优点4. 直观的相等比较

在Kotlin中不像Java调用equals()函数那么麻烦。

它可以直接对字符串进行比较

Demo

val y1 = Person("Ying")
val y2 = Person("Ying")
y1 == y2     // true  (结构相等)
y1 === y2    // false (参照相等)

参照相等: ===: 就是判断a, b是否为同一对象。也可以使用内联函数identityEquals() 判断参照相等。

结构相等: ==: 判断的。a, b的值是不是一样的,相当于y1.equals(y2)。

优点5. 默认参数 和 命名参数

不再使用不同的参数来定义类似的构造器:

结合默认参数值,命名参数可以消除 builders 的使用:

Demo

fun build(title: String, width: Int = 800, height: Int = 600) {
    Frame(title, width, height)
}

build("Ying", 400, 300)
build(title = "Ying", width = 400, height = 300)  
build(width = 400, height = 300, title = "Ying")

优点6. switch->When

switch 替换成了 when ,代码更具可读性:

Demo

when (x) {
    1 -> print("x is 1")
    2 -> print("x is 2")
    3, 4 -> print("x is 3 or 4")
    in 5..10 -> print("x is 5, 6, 7, 8, 9, or 10")
    else -> print("x is out of range")
}

下面的case既可为表达式,也可用作语句,也可作用于null:

val res: Boolean = when {
    obj == null -> false
    obj is String -> true
    else -> throw IllegalStateException()
}

优点7. 属性的getter和setter

直接在属性后面就可以生成getter和setter

Demo

class Frame {
    var width: Int = 800
    var height: Int = 600

    val pixels: Int
        get() = width * height      //geter
}

优点8. Data类

Data类这是一个POJO(Plain Ordinary Java Object)简单的Java对象,其中包含toString(),equals(),hashCode()和copy()等方法,与Java不同,它占用的代码量少了很多

Demo

data class Person(val name: String,
                  var email: String,
                  var age: Int)

val john = Person("Ying", "yzk.1314@outlook.com", 19)

优点9. 操作符重载

重载操作符提高代码可读性

Demo

data class Vec(val x: Float, val y: Float) {
    operator fun plus(v: Vec) = Vec(x + v.x, y + v.y)
}

val v = Vec(2f, 3f) + Vec(4f, 1f)

优点10. 解构

一些对象可以被解构,如对Map进行迭代

Demo

for ((key, value) in map) {
    print("Key: $key")
    print("Value: $value")
}

优点11. 变量范围

为了程序可读性而诞生

Demo

for (i in 1..100) { ... } 
for (i in 0 until 100) { ... }
for (i in 2..10 step 2) { ... } 
for (i in 10 downTo 1) { ... } 
if (x in 1..10) { ... }

优点12. 扩展函数

向已有的类里添加新的函数

这是官方文档

Demo

fun String.replaceSpaces(): String {
    return this.replace(' ', '_')
}

val formatted = str.replaceSpaces()

这样就拓展了原来的String类

str.removeSuffix(".txt")
str.capitalize()
str.substringAfterLast("/")
str.replaceAfter(":", "classified")

优点13. null安全机制

Java是一个几乎静态类型的编程语言。Java的String变量类型在一些情况下会等于null,导致程序猿总是要担心NullPointerException。

Kotlin的类型默认是不允许为空的,但是可以通过在后面加一个(?)问号来表示允许为空,例如:

var a: String = "abc"
a = null                // 编译报错

var b: String? = "xyz"
b = null                // 编译通过

当你访问一个可能为空类型的时候,Kotlin会编译报错,除非加上一个检查机制

如:

val x = b.length        // 编译报错: b可能为null
---------------------------------
if (b == null) return
val y = b.length        //编译通过

也可以使用安全调用(?),这样该表达式在 b 为空时返回null,而不是抛出空指针异常:

val x = b?.length       // x为可空的Int型

安全调用(?)问号可以进行套用,以避免像其他语言一样存在大量嵌套的if-not-null检查。

如果我们想要一个非null外的默认值,可以用 “?:”操作符

val name = ship?.captain?.name ?: "unknown"

如果上面你不想用的话,你刚刚又有不明确的要求,那只有抛出异常

val x = b?.length ?: throw NullPointerException()
val x = b!!.length              //和上面一样

优点14. 更好的 Lambdas

语法简单直接,如:

val sum = { x: Int, y: Int -> x + y }   // 相当于 sum = {(Int, Int) -> Int}
val res = sum(4,7)                      // 相当于:res == 11

Kotlin的Lambdas表达式优点体现在:

如果lambda表达式是方法的最后一个参数或者是唯一参数的话,那么该方法的括号可以移动或者省略.

如果我们选择不去声明单参数的lambda表达式的参数,那么Kotlin会隐式的将其命名为it.

所以说,下面的代码效果是一样的:

numbers.filter({ x -> x.isPrime() })
numbers.filter { x -> x.isPrime() }
numbers.filter { it.isPrime() }

还可以让你的代码更漂亮

如:

persons
    .filter { it.age >= 19 }
    .sortedBy { it.name }
    .map { it.email }
    .forEach { print(it) }

好了,上述就是笔者要说的一些优点,当然还有很多优点或一些确定是没说的,这就等着我们明晚和鹅厂的dalao们一起探讨吧!

原创声明,本文系作者授权云+社区-专栏发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

编辑于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏web编程技术分享

JavaScript: 零基础轻松学闭包(2)

2629
来自专栏Android先生

[译]Android防止内存泄漏的八种方法(下)

在上一篇Android内存泄漏的八种可能(上)中,我们讨论了八种容易发生内存泄漏的代码。其中,尤其严重的是泄漏Activity对象,因为它占用了大量系统内存。不...

752
来自专栏一个会写诗的程序员的博客

《Kotlin 程序设计》第六章 Kotlin 函数式编程(FP)第六章 Kotlin 函数式编程(FP)1. 函数式编程概述2. Kotlin函数式编程参考资料

从本质上来说, 程序就是一系列有序执行的指令集合。 如何将指令集合组织成可靠可用可信赖的软件(美妙的逻辑之塔), 这是个问题。

946
来自专栏AndroidTv

【Andorid源码解析】View.post() 到底干了啥

emmm,大伙都知道,子线程是不能进行 UI 操作的,或者很多场景下,一些操作需要延迟执行,这些都可以通过 Handler 来解决。但说实话,实在是太懒了,总感...

3376
来自专栏java技术学习之道

最通俗易懂的java注解讲解

1073
来自专栏一个会写诗的程序员的博客

《Kotlin 程序设计》第九章 Kotlin与Java混合调用

虽然 Kotlin 的开发很方便,但当你与他人协作时,总会碰到 Java 与 Kotlin 代码共存的代码项目。本章就教你如何优雅的实现 Kotlin 与 Ja...

1185
来自专栏程序员宝库

关于 Java 你不知道的 10 件事

作为 Java 书呆子,比起实用技能,我们会对介绍 Java 和 JVM 的概念细节更感兴趣。因此我想推荐 Lukas Eder 在 jooq.org 发表的原...

2785
来自专栏老司机的简书

老司机出品——包教包会之玩转正则表达式

结束了CoreAnimation系列之后,老司机心里仿佛也轻松了许多。今天说说开发中的一个利器吧,正则表达式。

1533
来自专栏一个会写诗的程序员的博客

《Kotlin 程序设计》第三章 Kotlin 类型系统第三章 Kotlin 类型系统基本数据类型2.字符类型CharKotlin类型系统参考资料

对象是带有属性和方法的特殊数据类型。笔者记得,在大学时候,学习C语言的结构体struct的时候,里面介绍过ADT(Abstract Data Type, 抽象数...

793
来自专栏拭心的安卓进阶之路

Java 基础巩固:内部类的字节码学习和实战使用场景

文章出自:安卓进阶学习指南 主要贡献者: Cloud9527 Alex_赵 Struggle shixinzhang 背景介绍 ? 大家好,这...

28810

扫码关注云+社区