kotlin高级用法总结

news2025/3/9 21:41:58

Kotlin 是一门功能强大且灵活的编程语言,除了基础语法外,它还提供了许多高级特性,可以帮助你编写更简洁、高效和可维护的代码。以下是 Kotlin 的一些高级用法,涵盖了协程、扩展函数、属性委托、内联类、反射等内容。

  1. 协程(Coroutines)
    协程是 Kotlin 中用于简化异步编程的核心特性。它允许你以同步的方式编写异步代码,避免回调地狱。

1.1 基本用法

import kotlinx.coroutines.*

fun main() = runBlocking {
    launch {
        delay(1000) // 非阻塞延迟
        println("World!")
    }
    println("Hello,")
}

runBlocking:阻塞当前线程,直到协程执行完毕。

launch:启动一个新的协程。

1.2 异步返回值
使用 async 和 await 获取异步结果:

fun main() = runBlocking {
    val result = async {
        delay(1000)
        "Hello, World!"
    }
    println(result.await()) // 输出:Hello, World!
}

1.3 结构化并发
通过 CoroutineScope 管理协程的生命周期:

fun main() = runBlocking {
    val scope = CoroutineScope(Dispatchers.Default)
    scope.launch {
        delay(1000)
        println("Task completed")
    }
    delay(500) // 等待一段时间
    scope.cancel() // 取消协程
}
  1. 扩展函数(Extension Functions)
    扩展函数允许你为现有类添加新方法,而无需修改其源代码。

2.1 基本用法

fun String.isPalindrome(): Boolean {
    return this == this.reversed()
}

fun main() {
    println("racecar".isPalindrome()) // 输出:true
}

2.2 扩展属性

val String.lastChar: Char
    get() = this[length - 1]

fun main() {
    println("Kotlin".lastChar) // 输出:n
}
  1. 属性委托(Property Delegation)
    属性委托允许你将属性的 getter 和 setter 逻辑委托给另一个对象。

3.1 使用 lazy 实现懒加载

val lazyValue: String by lazy {
    println("计算值")
    "Hello"
}

fun main() {
    println(lazyValue) // 第一次访问时计算
    println(lazyValue) // 直接使用缓存值
}

3.2 使用 Delegates.observable 监听属性变化

import kotlin.properties.Delegates

var observedValue: String by Delegates.observable("初始值") { _, old, new ->
    println("值从 $old 变为 $new")
}

fun main() {
    observedValue = "新值" // 输出:值从 初始值 变为 新值
}
  1. 内联类(Inline Classes)
    内联类用于封装一个值,同时避免运行时开销。

4.1 基本用法

inline class Password(val value: String)

fun main() {
    val password = Password("123456")
    println(password.value) // 输出:123456
}

4.2 优化性能
内联类在运行时会被替换为原始值,避免额外的对象分配。

  1. 反射(Reflection)
    反射允许你在运行时检查类和对象的属性和方法。

5.1 获取类的信息

import kotlin.reflect.full.memberProperties

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

fun main() {
    val user = User("Alice", 25)
    val properties = User::class.memberProperties
    for (property in properties) {
        println("${property.name} = ${property.get(user)}")
    }
}

5.2 动态调用方法

import kotlin.reflect.full.functions

class Calculator {
    fun add(a: Int, b: Int): Int = a + b
}

fun main() {
    val calculator = Calculator()
    val addFunction = Calculator::class.functions.find { it.name == "add" }!!
    val result = addFunction.call(calculator, 2, 3) as Int
    println(result) // 输出:5
}
  1. 高阶函数与 Lambda 表达式
    高阶函数是指以函数作为参数或返回值的函数。

6.1 基本用法

fun operateOnNumbers(a: Int, b: Int, operation: (Int, Int) -> Int): Int {
    return operation(a, b)
}

fun main() {
    val sum = operateOnNumbers(2, 3) { x, y -> x + y }
    println(sum) // 输出:5
}

6.2 内联函数
使用 inline 关键字避免 Lambda 表达式的运行时开销:

inline fun measureTime(block: () -> Unit) {
    val start = System.currentTimeMillis()
    block()
    val end = System.currentTimeMillis()
    println("耗时:${end - start} 毫秒")
}

fun main() {
    measureTime {
        Thread.sleep(1000)
    }
}
  1. 密封类(Sealed Classes)
    密封类用于表示受限的类层次结构,子类必须在同一文件中定义。

7.1 基本用法

sealed class Result
data class Success(val data: String) : Result()
data class Error(val message: String) : Result()

fun handleResult(result: Result) {
    when (result) {
        is Success -> println("成功:${result.data}")
        is Error -> println("错误:${result.message}")
    }
}

fun main() {
    val result = Success("数据加载成功")
    handleResult(result) // 输出:成功:数据加载成功
}
  1. 泛型与型变
    8.1 泛型类
class Box<T>(val value: T)

fun main() {
    val box = Box(42)
    println(box.value) // 输出:42
}

8.2 型变(Variance)
协变(out):允许子类型替换父类型。

class Producer<out T>(val value: T)

逆变(in):允许父类型替换子类型。

class Consumer<in T> {
    fun consume(value: T) {
        println(value)
    }
}
  1. DSL(领域特定语言)
    Kotlin 的 DSL 功能允许你创建领域特定语言,使代码更具表现力。

9.1 构建 HTML DSL

class HTML {
    fun body(block: Body.() -> Unit) {
        val body = Body()
        body.block()
        println(body)
    }
}

class Body {
    var content: String = ""

    fun p(block: () -> String) {
        content += "<p>${block()}</p>"
    }
}

fun html(block: HTML.() -> Unit): HTML {
    val html = HTML()
    html.block()
    return html
}

fun main() {
    html {
        body {
            p { "Hello, World!" }
        }
    }
}
  1. 总结
    Kotlin 的高级特性包括:

协程:简化异步编程。

扩展函数和属性:增强现有类的功能。

属性委托:简化属性逻辑。

内联类:优化性能。

反射:动态操作类和对象。

高阶函数与 Lambda:支持函数式编程。

密封类:受限的类层次结构。

泛型与型变:增强类型安全性。

DSL:创建领域特定语言。

掌握这些高级用法,可以让你在 Kotlin 中编写更高效、灵活和可维护的代码!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2312357.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【江协科技STM32】ADC数模转换器-学习笔记

ADC简介 ADC&#xff08;Analog-Digital Converter&#xff09;模拟-数字转换器ADC可以将引脚上连续变化的模拟电压转换为内存中存储的数字变量&#xff0c;建立模拟电路到数字电路的桥梁&#xff0c;ADC是一种将连续的模拟信号转换为离散的数字信号的设备或模块12位逐次逼近型…

嵌入式学习笔记-卡尔曼滤波,PID,MicroPython

文章目录 卡尔曼滤波卡尔曼滤波的核心思想卡尔曼滤波的数学模型1. 状态转移模型&#xff08;预测系统状态&#xff09;2. 观测模型&#xff08;预测测量值&#xff09; 卡尔曼滤波的五个关键步骤1. 预测状态2. 预测误差协方差3. 计算卡尔曼增益4. 更新状态5. 更新误差协方差 卡…

upload-labs文件上传

第一关 上传一个1.jpg的文件&#xff0c;在里面写好一句webshell 保留一个数据包&#xff0c;将其中截获的1.jpg改为1.php后重新发送 可以看到&#xff0c;已经成功上传 第二关 写一个webshell如图&#xff0c;为2.php 第二关在过滤tpye的属性&#xff0c;在上传2.php后使用b…

C++20 格式化库:强大的字符串格式化工具

文章目录 格式化语法常见用法1. 填充和对齐2. 数值格式化3. 进制格式化4. 自定义类型 示例代码注意事项 C20 的格式化库是一个强大的工具&#xff0c;用于处理字符串的格式化操作。它提供了类似于 Python 中 str.format() 的功能&#xff0c;但语法和用法更符合 C 的风格。以下…

[傻瓜式教学]如何将MathType公式编辑器内嵌到WPS工具栏中

[傻瓜式教学]如何将MathType公式编辑器内嵌到WPS工具栏中 将MathType公式编辑器内嵌到WPS工具栏中 下载好所需文件 我用夸克网盘分享了「mathtype安装教程超简单易上手.zip」&#xff0c;点击链接即可保存。打开「夸克APP」 链接&#xff1a;https://pan.quark.cn/s/4726c684…

分析TCP三次握手与四次挥手

TCP&#xff08;传输控制协议&#xff09;通过三次握手建立连接&#xff0c;四次挥手终止连接&#xff0c;确保数据传输的可靠性。 TCP的三个控制标志位&#xff1a; SYN——用于建立连接&#xff0c;同步序列号。 ACK——用于确认收到的数据。 FIN——用于终止连接。 ISN…

【深度学习】宠物品种分类Pet Breeds Classifier

文章目录 宠物品种数据集制作宠物品种标签图像预处理Presizing 损失函数loss观察模型的性能提升模型的性能learning rate finder使用CLR算法训练选择学习率的策略重新训练 迁移学习微调fine_tunefit_one_cycle有判别力的学习率 选择epoch的数量更深的网络架构 宠物品种数据集 …

【从零开始学习计算机科学】HLS算子调度

算子调度 调度是HLS 中的核心问题,为无时序或部分时序的输入指定时钟边界,其对最终结果质量具有很大的影响。调度会影响时钟频率、延时、吞吐率、面积、功耗等多种因素。 调度的输入是控制数据流图,其节点表示算子/操作,有向边表示数据依赖,控制依赖,优先依赖。如果没有…

centos 安装composer 教程

打开命令行 php -r "copy(https://getcomposer.org/installer, composer-setup.php);" sudo php composer-setup.php --install-dir/usr/local/bin --filenamecomposer composer --version sudo chmod us /usr/local/bin/composer Super18120/article/details/14388…

C语言_数据结构总结2:动态分配方式的顺序表

0——静态分配内存的顺序表和动态分配内存的顺序表的相同之处和不同之处 相同之处 基本操作逻辑相同&#xff1a;无论是静态分配还是动态分配的顺序表&#xff0c;其核心的操作逻辑是一致的。例如插入操作都需要将插入位置之后的元素依次后移&#xff0c;删除操作都需要将删除…

WSL安装及问题

1 概述 Windows Subsystem for Linux&#xff08;简称WSL&#xff09;是一个在Windows 10\11上能够运行原生Linux二进制可执行文件&#xff08;ELF格式&#xff09;的兼容层。它是由微软与Canonical公司合作开发&#xff0c;开发人员可以在 Windows 计算机上同时访问 Windows 和…

基于SpringBoot的商城管理系统(源码+部署教程)

运行环境 数据库&#xff1a;MySql 编译器&#xff1a;Intellij IDEA 前端运行环境&#xff1a;node.js v12.13.0 JAVA版本&#xff1a;JDK 1.8 主要功能 基于Springboot的商城管理系统包含管理端和用户端两个部分&#xff0c;主要功能有&#xff1a; 管理端 首页商品列…

HeidiSQL:一款免费的数据库管理工具

HeidiSQL 是一款免费的图形化数据库管理工具&#xff0c;支持 MySQL、MariaDB、Microsoft SQL、PostgreSQL、SQLite、Interbase 以及 Firebird&#xff0c;目前只能在 Windows 平台使用。 HeidiSQL 的核心功能包括&#xff1a; 免费且开源&#xff0c;所有功能都可以直接使用。…

Ae 效果详解:VR 色差

Ae菜单&#xff1a;效果/沉浸式视频/VR 色差 Immersive Video/VR Chromatic Aberrations VR 色差 VR Chromatic Aberrations效果用于模拟镜头色散现象&#xff0c;在 VR 视频中制造 RGB 通道错位的色彩偏移&#xff0c;以增强视觉风格或创造数字失真效果。 本效果适用于所有色深…

计算机毕业设计SpringBoot+Vue.js制造装备物联及生产管理ERP系统(源码+文档+PPT+讲解)

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…

【Linux内核系列】:深入解析输出以及输入重定向

&#x1f525; 本文专栏&#xff1a;Linux &#x1f338;作者主页&#xff1a;努力努力再努力wz ★★★ 本文前置知识&#xff1a; 文件系统以及文件系统调用接口 用c语言简单实现一个shell外壳程序 内容回顾 那么在此前的学习中&#xff0c;我们对于Linux的文件系统已经有了…

PyTorch系列教程:Tensor.view() 方法详解

这篇简明扼要的文章是关于PyTorch中的tensor.view()方法的介绍与应用&#xff0c;与reshape()方法的区别&#xff0c;同时给出示例进行详细解释。 Tensor基础 Tensor(张量)的视图是一个新的Tensor&#xff0c;它与原始Tensor共享相同的底层数据&#xff0c;但具有不同的形状或…

软件测试的基础入门(二)

文章目录 一、软件&#xff08;开发&#xff09;的生命周期什么是生命周期软件&#xff08;开发&#xff09;的生命周期需求分析计划设计编码测试运行维护 二、常见的开发模型瀑布模型流程优点缺点适应的场景 螺旋模型流程优点缺点适应的场景 增量模型和迭代模型流程适应的场景…

地下变电站如何实现安全智能运营-以110kV站为例看环境监测与设备联控

1、地下变电站简介 在经济发达的地区&#xff0c;由于城市中心土地资源紧张、征地拆迁费用昂贵&#xff0c;因此采用地下变电站来解决这些问题不失为一个好的途径和思路。地下变电站一般采用室内全封闭式组合电气设备&#xff0c;&#xff12;&#xff12;&#xff10;&#x…

windows无界面后台定时任务 (重启自启动,ODBS为例)

一、前言 mdb(Microsoft Database)是Microsoft Access中使用的一种数据存储格式,可以通过ODBC驱动程序进行访问和操作,在Python中也可以安装相应模块打开。 这是我在项目中更新bs数据的一个实践记录,结合windows定时一起记录一下,方便以后照搬~ 二、安装 Python安装库…