0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Kotlin的语法糖解析

jf_78858299 来源:labuladong 作者:labuladong 2023-04-19 10:21 次阅读

最近又开始要写一些客户端代码,现在项目都是使用Kotlin,但是之前没有系统的学习过Kotlin,对于Kotlin的一些语法糖还不熟悉,所以写篇文章总结下。

变量声明与类型推断

Kotlin中可以使用关键字val和var声明不可变变量和可变变量,而且可以根据变量的初始值自动推断出变量的类型。例如:

// Java代码
String str = "Hello, world!";
List<String> list = new ArrayList<>();

// Kotlin代码
val str = "Hello, world!"
val list = mutableListOf<String>()

使用上述Kotlin代码,可以更加简洁地完成变量的声明和类型推断。

空安全机制

Kotlin中使用?和!!运算符来处理空安全问题,可以避免空指针异常的发生。例如:

// Java代码
String str = null;
if (str != null) {
    int length = str.length();
}

// Kotlin代码
val str: String? = null
val length = str?.length ?: 0

使用上述Kotlin代码,可以更加简洁地处理空安全问题。

Lambda表达式

Kotlin中可以使用Lambda表达式来代替匿名内部类,可以更加简洁地编写函数式代码。例如:

// 接收一个Int类型参数,返回一个Int类型参数
val square: (Int) -> Int = { x -> x * x }

// 简化形式,使用it代替参数名
val square: (Int) -> Int = { it * it }

区间表达式

Kotlin中可以使用区间表达式来表示一段连续的数值范围,可以更加简洁地完成一些循环操作。例如:

// Java代码
for (int i = 0; i < 10; i++) {
    System.out.println(i);
}

// Kotlin代码
for (i in 0 until 10) {
    println(i)
}

数据类

Kotlin中的数据类是一种特殊的类,用于存储数据。数据类可以自动生成equals()、hashCode()、toString()等方法。在Kotlin中,可以使用data class关键字来定义数据类。例如:

// 定义一个数据类Person,包含name和age两个属性
data class Person(val name: String, val age: Int)

// 创建一个Person对象
val person = Person("John", 20)

// 自动生成toString()方法,输出:Person(name=John, age=20)
println(person)

扩展函数

Kotlin中的扩展函数是一种特殊的函数,可以为任意类型添加新的函数。在Kotlin中,可以使用fun关键字来定义扩展函数。例如:

// 为Int类型添加一个times()扩展函数,用于计算平方值
fun Int.times() = this * this

// 使用扩展函数计算2的平方值
val square = 2.times() // 等价于2 * 2

命名参数

Kotlin中的命名参数可以让函数调用更加灵活,可以指定参数的名称。在Kotlin中,可以使用=符号来指定参数的名称和值。例如:

// 定义一个函数,包含两个参数name和age
fun printInfo(name: String, age: Int) {
   println("$name is $age years old.")
}

// 使用命名参数调用函数,参数的名称可以任意指定
printInfo(age = 20, name = "John")

默认参数

Kotlin中的默认参数可以为函数参数指定默认值,如果调用函数时没有传递这个参数,则使用默认值。在Kotlin中,可以使用=符号来为参数指定默认值。例如:

// 定义一个函数,包含两个参数name和age,age的默认值为18
fun printInfo(name: String, age: Int = 18) {
   println("$name is $age years old.")
}

// 调用函数时不传递age参数,将使用默认值18
printInfo("John")

// 调用函数时传递age参数,将使用传递的值
printInfo("Mary", 20)

中缀表示法

中缀表达式是 Kotlin 中另一个有趣的语法糖。在 Kotlin 中,我们可以使用 infix 关键字将某个函数标记为中缀函数。这意味着我们可以在函数名和参数之间省略点号和括号。 例如,下面的代码展示了如何使用中缀表达式:

class MyInt(val value: Int) {
    infix fun add(other: MyInt): MyInt {
        return MyInt(value + other.value)
    }
}

fun main() {
    val a = MyInt(2)
    val b = MyInt(3)

    val c = a add b // Using infix notation

    println(c.value) // Output: 5
}

在上面的代码中,add 函数被标记为中缀函数。因此,我们可以像使用运算符一样使用它,而无需使用点号和括号。

在实际编码中,中缀表达式常常用于更自然地表达某些操作,例如 and 和 or 操作符:

fun main() {
    val a = true
    val b = false

    val c = a and b // Using infix notation
    val d = a or b // Using infix notation

    println(c) // Output: false
    println(d) // Output: true
}

在这个例子中,我们使用 and 和 or 操作符来演示中缀表达式的用法。由于这些操作符被标记为中缀函数,因此我们可以使用它们的中缀表达式形式来更自然地表达布尔运算。

Elvis 运算符 ?:

Elvis 运算符 ?: 可以用于缩短空值检查的代码。它的使用方法是:当左侧的表达式非空时,返回左侧的值,否则返回右侧的值。例如:

val name: String? = null
val message = "Hello, ${name ?: "Guest"}"
println(message) // Output: "Hello, Guest"

在上面的例子中,我们使用了 Elvis 运算符 ?: 来检查变量 name 是否为空。由于 name 是空的,所以表达式的结果是右侧的字符串 "Guest"。

类型别名

类型别名可以让我们给一个类型起一个别名,使得代码更易读。例如:

typealias UserName = String
typealias Password = String

fun login(username: UserName, password: Password) {
    // ...
}

在上面的代码中,我们为 String 类型起了两个别名,UserName 和 Password。这样在函数参数中使用别名可以使代码更具有可读性。

in 运算符

Kotlin 中的 in 运算符可以用于判断一个元素是否在一个区间、集合或数组中。例如:

val numbers = listOf(1, 2, 3, 4, 5)

if (3 in numbers) {
    println("3 is in the list")
}

在上面的代码中,我们使用 in 运算符来判断数字 3 是否在 numbers 集合中。

解构声明

在 Kotlin 中,我们可以使用解构声明从一个对象中快速提取多个属性并赋值给多个变量。例如:

data class User(val name: String, val age: Int)

val user = User("Alice", 25)
val (name, age) = user

println("Name: $name, Age: $age")

在上面的代码中,我们定义了一个 User 类,并且使用解构声明从 user 对象中提取了 name 和 age 属性并分别赋值给了 name 和 age 变量。

对象表达式和对象声明

在 Kotlin 中,我们可以使用对象表达式创建一个匿名对象,也可以使用对象声明创建一个单例对象。例如:

// 对象表达式
val obj = object {
    val x = 10
    fun printX() {
        println(x)
    }
}

obj.printX() // 输出 10

// 对象声明
object Singleton {
    fun doSomething() {
        println("Singleton object is doing something.")
    }
}

Singleton.doSomething() // 输出 "Singleton object is doing something."

在上面的代码中,我们使用对象表达式创建了一个匿名对象,并且在这个对象中定义了一个 x 属性和一个 printX() 函数。我们还使用对象声明创建了一个单例对象,并且在这个对象中定义了一个 doSomething() 函数。

with 和 apply 函数

Kotlin 中的 with() 和 apply() 函数可以用于简化某些操作。with() 函数接收一个对象和一个 Lambda 表达式,可以在 Lambda 表达式中直接访问对象的属性和方法,例如:

val person = Person("Alice", 25)

with(person) {
    name = "Bob"
    age += 1
}

println("Name: ${person.name}, Age: ${person.age}") // 输出 "Name: Bob, Age: 26"

在上面的代码中,我们使用 with() 函数修改了 person 对象的 name 和 age 属性。

apply() 函数和 with() 函数类似,但是它返回对象本身,可以使用链式调用的方式设置多个属性,例如:

val person = Person("Alice", 25).apply {
    name = "Bob"
    age += 1
}

println("Name: ${person.name}, Age: ${person.age}") // 输出 "

let语法

let 函数是一个非常有用的语法糖,它允许您在一个对象上执行一个操作,并返回结果。这个操作可以是一个函数或一个代码块。let 函数有以下两种形式:

  • let { }:执行给定的代码块,以当前对象作为其参数,并返回结果。
  • obj.let { }:执行给定的代码块,以 obj 作为其参数,并返回结果。 下面是一个使用 let 函数的例子,假设我们有一个字符串列表,我们想打印列表中所有元素的长度,但只有在元素不为空时才打印:
val stringList = listOf("Hello", null, "World", null, "Kotlin")
stringList.filterNotNull().map { it.length }.forEach { println(it) }

这里我们使用了 filterNotNull() 函数来过滤空元素,并使用 map 函数将非空元素转换为它们的长度,然后使用 forEach 函数打印每个长度。这个例子很简单,但它可能会让代码变得混乱和难以阅读。让我们使用 let 函数来重写这个例子:

val stringList = listOf("Hello", null, "World", null, "Kotlin")
stringList.forEach {
    it?.let { str ->
        println(str.length)
    }
}

在这个例子中,我们使用 forEach 函数来遍历字符串列表。在每个元素上调用 let 函数,如果元素不为空,则打印它的长度。这个例子使用了简洁的语法,使代码更易于阅读和理解。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 代码
    +关注

    关注

    30

    文章

    4841

    浏览量

    69194
  • kotlin
    +关注

    关注

    0

    文章

    60

    浏览量

    4222
收藏 人收藏

    评论

    相关推荐

    ZZ:口香电池

    `由Ping-Yi Lin带来的概念设计:口香电池(Chewing Gum Battery)。将电池设计成一片一片的口香模样,放入类似自动贩卖机的太阳能基站给其充电。使用时只需要依照产品的电压
    发表于 10-12 14:46

    果儿洛克王国辅助 1.02

      1、【洛克王国辅助】 果儿洛克王国辅助 1.02  软件名称:果儿洛克王国辅助 1.02   软件大小: 4.0M  软件分类: 洛克王国辅助  软件语言: 简体  运行环镜: WinXP
    发表于 02-14 15:17

    drools高级语法解析

    drools入门(六) - drools高级语法
    发表于 09-30 06:27

    求助,官方出的MESH DEMO怎么改成了Kotlin和JAVA混和了?

    对于我们大多数搞偏硬件的,一般都是用C的,对于C++,JAVA有天生的熟悉感,稍微学习一下,在官方的基础上搞个东西难度不大,但是现在这个Kotlin是个什么鬼?语法规则完全不同了,连分号都不
    发表于 09-21 07:31

    分析Kotlin和Java EE的关系

    本文分析了Kotlin和Java EE的关系,讨论了如何利用Kotlin的运算符,可空性和可选项来优化转换的效果。 将Java EE应用程序转换为Kotlin开始于框架的战斗,我们成功地超越了
    发表于 09-28 17:12 0次下载
    分析<b class='flag-5'>Kotlin</b>和Java EE的关系

    Kotlin的概述

    相信很多开发人员,尤其是Android开发者都会或多或少听说过Kotlin,当然如果没有听过或者不熟悉也没有关系。因为本篇文章以及博客后期的内容会涉及到很多关于Kotlin的知识分享。 在写
    发表于 09-28 19:48 0次下载
    <b class='flag-5'>Kotlin</b>的概述

    Kotlin编程语言现在是Android应用程序开发人员的首选语言

    Kotlin 是一门与 Swift 类似的静态类型 JVM 语言,由 JetBrains 设计开发并开源。与 Java 相比,Kotlin语法更简洁、更具表达性,而且提供了更多的特性,比如,高阶函数、操作符重载、字符串模板。
    的头像 发表于 05-10 08:49 2650次阅读

    Kotlin实战与Android的应用笔记详细说明

    Kotlin语言在Android Studio中应用前景广阔,本文是编者在应用开发中查找资料的总结,内容主要来自网络,读者可以作为手册来查找并复制有用的内容到自己的应用当中。 Kotlin语言部分
    发表于 12-31 08:00 0次下载
    <b class='flag-5'>Kotlin</b>实战与Android的应用笔记详细说明

    使用Kotlin替代Java重构AOSP应用

    最佳实践,另外则是提供优先使用 Kotlin 进行应用开发的良好范例。Kotlin 之所以具有强大的吸引力,原因之一是其简洁的语法,很多情况下用 Kotlin 编写的代码块的代码数量
    的头像 发表于 09-16 09:26 1949次阅读
    使用<b class='flag-5'>Kotlin</b>替代Java重构AOSP应用

    使用Kotlin构建Android应用的基础知识

    2021 年 10 月,我们发布了 "使用 Kotlin 构建 Android 应用的基础知识" 课程的最后一个单元,这是我们推出的免费自学编程课程,致力于帮助没有编程经验的人
    的头像 发表于 03-29 09:20 1695次阅读

    bilisoleil-kotlin Kotlin版仿B站项目

    ./oschina_soft/bilisoleil-kotlin.zip
    发表于 06-10 14:12 0次下载
    bilisoleil-<b class='flag-5'>kotlin</b> <b class='flag-5'>Kotlin</b>版仿B站项目

    将其Android应用的Java代码迁移到Kotlin

    Meta 称,迁移到 Kotlin 既简单又非常复杂。因为 Kotlin 的设计允许从 Java 进行简单的转换,并具有经过深思熟虑的互操作性。这种设计使 JetBrains 能够为开发人员社区提供
    的头像 发表于 10-28 15:15 786次阅读

    语法分析-Antlr

    上一节,我们通过Antlr快速的落地实现了Token的解析,这一节我们还是基于Antlr来实现语法解析
    的头像 发表于 03-03 10:14 746次阅读
    <b class='flag-5'>语法</b>分析-Antlr

    Android自定义Toast Kotlin

    电子发烧友网站提供《Android自定义Toast Kotlin.zip》资料免费下载
    发表于 06-16 11:43 0次下载
    Android自定义Toast <b class='flag-5'>Kotlin</b>

    由Java改为 Kotlin过程中遇到的坑

    最近了解了下 Kotlin ,其中的很多语法很有意思,并且可以与 Java 无缝兼容。故尝试在一个 SpringBoot 工程上将部分类修改为 Kotlin ,下面记录了由 Java
    的头像 发表于 09-30 16:51 893次阅读
    由Java改为 <b class='flag-5'>Kotlin</b>过程中遇到的坑