Kotlin学习——kt入门合集博客 kt里的委派模式Delegation kt里的特性

Kotlin 是一门现代但已成熟的编程语言,旨在让开发人员更幸福快乐。 它简洁、安全、可与 Java 及其他语言互操作,并提供了多种方式在多个平台间复用代码,以实现高效编程。
https://play.kotlinlang.org/byExample/01_introduction/02_Functions
其他关于kt的博客文章如下:
- Kotlin学习——hello kotlin & 函数function & 变量 & 类 + 泛型 + 继承
- Kotlin学习——流程控制,when,循环,range工具 & kt里的equals & if实现类似三元表达式的效果
- Kotlin学习——kt中的类,数据类 & 枚举类 & 密封类,以及对象
- Kotlin学习——kt里面的函数,高阶函数 & 函数式编程 & 扩展函数和属性
- Kotlin学习——kt里的集合List,Set,Map & List集合的各种方法之Int篇
- Kotlin学习——kt里的集合,Map的各种方法之String篇
- Kotlin学习——kt里的作用域函数scope function,let,run,with,apply,also
目录
- 引出
- kt里的委派模式
- Delegation Pattern 委派模式 by关键字
- Delegated Properties 属性委派
- lazy懒加载
- map中存储属性
- productivity boosters生产力助推器
- Named Arguments命名参数
- $占位符在String中
- Destructuring Declarations 破坏声明语法
- Smart Casts 聪明的编译器
- 总结
引出
1.kt里的委派模式Delegation;
2.kt里的特性,productivity boosters生产力助推器;
kt里的委派模式
Delegation Pattern 委派模式 by关键字
Kotlin支持在本地级别轻松实现委派模式,而无需任何样板代码。
- 将方法调用委托给负责的实现。委托对象是在关键字by之后定义的
package com.tianju.kt.scopeFunc/*** 定义一个接口*/
interface SoundBehavior {fun makeSound()
}/*** 实现方法*/
class ScreamBehavior(val n:String): SoundBehavior {override fun makeSound() = println("${n.uppercase()} !!!")
}class RockAndRollBehavior(val n:String): SoundBehavior {override fun makeSound() = println("I'm The King of Rock 'N' Roll: $n")
}// 将方法调用委托给负责的实现。委托对象是在关键字by之后定义的
// Tom Araya is the "singer" of Slayer
class TomAraya(n:String): SoundBehavior by ScreamBehavior(n)// You should know ;)
class ElvisPresley(n:String): SoundBehavior by RockAndRollBehavior(n)fun main() {val tomAraya = TomAraya("Thrash Metal")tomAraya.makeSound()val elvisPresley = ElvisPresley("Dancin' to the Jailhouse Rock.")elvisPresley.makeSound()
}

Delegated Properties 属性委派
Kotlin提供了一种委托属性机制,允许将属性集的调用和get方法委托给某个对象。在这种情况下,委托对象应该具有getValue方法。对于可变属性,您还需要setValue。
package com.tianju.kt.scopeFuncimport kotlin.reflect.KPropertyclass Example{var p:String by Delegate()override fun toString(): String {return "Example Class"}
}class Delegate() {operator fun getValue(thisRef: Any?, prop: KProperty<*>): String {return "$thisRef, thank you for delegating '${prop.name}' to me!"}operator fun setValue(thisRef: Any?, prop: KProperty<*>, value: String) {println("$value has been assigned to ${prop.name} in $thisRef")}
}fun main() {val e = Example()println(e.p)e.p = "WATT"
}s

lazy懒加载
Kotlin标准库包含一堆有用的委托,比如懒惰的lazy、可观察observable的和其他的
package com.tianju.kt.scopeFuncclass LazySample {/*** 静态代码块*/init {println("created!")}/*** by lazy 懒加载*/val lazyStr: String by lazy {println("computed!")"my lazy"}
}fun main() {// 创建对象时未初始化属性lazyval sample = LazySample()// 调用的时候才会初始化属性println("lazyStr = ${sample.lazyStr}")println(" = ${sample.lazyStr}")
}
map中存储属性
属性委派可用于在映射中存储属性。这对于解析JSON或执行其他“动态”操作等任务非常方便。
package com.tianju.kt.ktLast/*** 可以从map转换为对象*/
class User(val map: Map<String, Any?>) {val name: String by mapval age: Int by map
}fun main() {val stringMap = mapOf("name" to "John Doe","age" to 25)println(stringMap)val user = User(stringMap)println("name = ${user.name}, age = ${user.age}")
}

productivity boosters生产力助推器
Named Arguments命名参数
与大多数其他编程语言(Java、C++等)一样,Kotlin支持根据方法和构造函数的定义顺序将参数传递给它们。Kotlin还支持命名参数,以允许更清晰的调用,并避免参数顺序错误。
package com.tianju.kt.ktLastfun format(userName: String, domain: String) = "$userName@$domain"fun main() {println(format("mario", "example.com"))println(format("domain.com", "username"))println(format(userName = "foo", domain = "bar.com"))println(format(domain = "frog.com", userName = "pepe"))
}

$占位符在String中
字符串模板允许您将变量引用和表达式包含到字符串中。当请求字符串的值时(例如,通过println),所有引用和表达式都会被实际值替换。
package com.tianju.kt.ktLastfun main() {val greeting = "Kotliner"println("Hello $greeting")println("Hello ${greeting.uppercase()}")
}

Destructuring Declarations 破坏声明语法
破坏声明语法非常方便,尤其是当您只需要一个实例来访问其成员时。它允许您在没有特定名称的情况下定义实例,从而节省了几行代码。
package com.tianju.kt.ktLastfun findMinMax(list: List<Int>): Pair<Int, Int> {// do the mathreturn Pair(50, 100)
}fun main() {val (x, y, z) = arrayOf(5, 10, 15)println(x)// 初始化一个map集合val map = mapOf("Alice" to 21, "Bob" to 25)for ((name, age) in map) {println("$name is $age years old")}val (min, max) = findMinMax(listOf(100, 90, 50, 98, 76, 83))}

使用下划线,避免编译器提示指示未使用的变量
package com.tianju.kt.ktLdata class User(val username: String, val email: String)fun getUser() = User("Mary", "mary@somewhere.com")fun main() {val user = getUser()// 解构实例。声明的值映射到实例字段val (username, email) = userprintln(username == user.component1())val (_, emailAddress) = getUser()println(emailAddress)
}


package com.tianju.kt.ktLclass Pair<K, V>(val first: K, val second: V) {operator fun component1(): K {return first}operator fun component2(): V {return second}
}fun main() {val (num, name) = Pair(1, "one")println("num = $num, name = $name")
}
Smart Casts 聪明的编译器
Kotlin编译器足够聪明,可以在大多数情况下自动执行类型转换,包括:
-
从可为null的类型转换为不可为null类型。
-
从超类型转换为子类型。
package com.tianju.kt.ktLimport java.time.LocalDate
import java.time.chrono.ChronoLocalDatefun main() {// 声明一个可为null的变量val date: ChronoLocalDate? = LocalDate.now() if (date != null) {println(date.isLeapYear) }if (date != null && date.isLeapYear) { println("It's a leap year!")}if (date == null || !date.isLeapYear) { println("There's no Feb 29 this year...")}if (date is LocalDate) {val month = date.monthValue println(month)}
}
总结
1.kt里的委派模式Delegation;
2.kt里的特性,productivity boosters生产力助推器;
相关文章:
Kotlin学习——kt入门合集博客 kt里的委派模式Delegation kt里的特性
Kotlin 是一门现代但已成熟的编程语言,旨在让开发人员更幸福快乐。 它简洁、安全、可与 Java 及其他语言互操作,并提供了多种方式在多个平台间复用代码,以实现高效编程。 https://play.kotlinlang.org/byExample/01_introduction/02_Functio…...
数据挖掘 朴素贝叶斯
直入正题,直接看代码: 这是一段判断是不是藏话的代码 import numpy as np# 数据采集(定义函数加载数据集) def load_dataset():sent_list [[my, name, is, Devin],[you, are, stupid],[my, boyfriend, is, SB],[you, looks, ver…...
UI自动化测试工具有哪些优势?
UI自动化测试工具通过提高测试效率、覆盖率,减少测试时间和成本,以及支持持续集成等方式,为软件开发团队提供了一系列重要的优势,有助于提升软件质量和开发效率。 自动化执行:UI自动化测试工具可以模拟用户与应用程序的…...
【论文阅读笔记】InstructDiffusion: A Generalist Modeling Interface for Vision Tasks
【论文阅读笔记】StyleAvatar3D: Leveraging Image-Text Diffusion Models for High-Fidelity 3D Avatar Generation 论文阅读笔记论文信息引言动机挑战 方法结果 关键发现相关工作1. 视觉语言基础模型2. 视觉通用模型 方法/模型视觉任务的统一说明训练数据构建网络结构 实验设…...
笔记62:注意力汇聚 --- Nadaraya_Watson 核回归
本地笔记地址:D:\work_file\(4)DeepLearning_Learning\03_个人笔记\3.循环神经网络\第10章:动手学深度学习~注意力机制 a a a a a a a a a a a a a a a a...
给定一个n×n的方阵,本题要求计算该矩阵除副对角线、最后一列和最后一行以外的所有元素之和。
7-5 矩阵运算 分数 20 全屏浏览题目 切换布局 作者 C课程组 单位 浙江大学 给定一个nn的方阵,本题要求计算该矩阵除副对角线、最后一列和最后一行以外的所有元素之和。副对角线为从矩阵的右上角至左下角的连线。 输入格式: 输入第一行给出正整数n(…...
Go语言的学习笔记3——Go语言项目布局
Go 1.11 版本开始引入 go.mod 和 go.sum 以支持Go Module构建机制,而这种机制成为官方的依赖包管理方式。 现在Go可执行程序项目的典型布局如下所示: exe-layout ├── cmd/ │ ├── app1/ │ │ └── main.go │ └── app2/ │ └…...
70-76-堆、贪心算法
LeetCode 热题 100 文章目录 LeetCode 热题 100堆70. 中等-数组中的第K个最大元素71. 中等-前K个高频元素72. 困难-数据流中的中位数 贪心算法73. 简单-买卖股票的最佳时机74. 中等-跳跃游戏75. 中等-跳跃游戏II76. 中等-划分字母区间 本文存储我刷题的笔记。 堆 70. 中等-数组…...
Qt Network
Qt Network Qt Network为使用TCP/IP的应用程序编程提供了一组API。各种C++类处理诸如请求、cookies和通过HTTP发送数据之类的操作。 标题使用模块 使用Qt模块需要直接或通过其他依赖项链接到模块库。一些构建工具对此有专门的支持,包括CMake和qmake. 标题使用CMake构建 使…...
Win10电脑用U盘重装系统的步骤
在Win10电脑中,用户遇到了无法解决的系统问题,用户这时候就可以考虑重装Win10系统,这样即可轻松解决问题,从而满足自己的操作需求。接下来小编给大家详细介绍关于Win10电脑中用U盘重装系统的教程步骤。 准备工作 1. 一台正常联网可…...
安防视频监控/磁盘阵列/集中云存储平台EasyCVR设备录像保活不生效原因是什么?该如何解决?
安防视频监控/视频集中存储/云存储/磁盘阵列EasyCVR平台可拓展性强、视频能力灵活、部署轻快,可支持的主流标准协议有国标GB28181、RTSP/Onvif、RTMP等,以及支持厂家私有协议与SDK接入,包括海康Ehome、海大宇等设备的SDK等。平台既具备传统安…...
【JDK21】详解虚拟线程
目录 1.概述 2.虚拟线程是为了解决哪些问题 2.1.线程切换的巨大代价 2.2.哪些情况会造成线程的切换 2.3.线程资源是有限的 3.虚拟线程 4.适用场景 1.概述 你发任你发,我用JAVA8?JDK21可能要对这句话say no了。 现在Oracle JDK是每4个版本&#x…...
UE5 - 虚幻引擎各模块流程图
来自虚幻官方的一些资料,分享一下; 一些模块的流程图,比如动画模块: 或角色相关流程: 由于图片比较大,上传到了网络,可自取: 链接:https://pan.baidu.com/s/1BQ2KiuP08c…...
vue3实现element table缓存滚动条
背景 对于后台管理系统,数据的展示形式大多都是通过表格,常常会出现的一种场景,从表格跳到二级页面,再返回上一页时,需要缓存当前的页码和滚动条的位置,以为使用keep-alive就能实现这两种诉求,…...
flutter布局详解及代码示例(下)
布局 基本布局 GridView(二维滚动列表):比ListView多了一个方向的数据填充。ListBody(滚动列表):相比ListView,没有回收复用,简单易用。Table(表格布局)&am…...
SQL Server:流程控制语言详解
文章目录 一、批处理、脚本和变量局部变量和全局变量1、局部变量2、全局变量 二、顺序、分支和循环结构语句1、程序注释语句2、BEGIN┅END语句块3、IF┅ELSE语句4、CASE语句5、WHILE语句6、BREAK和CONTINUE语句BREAK语句CONTINUE语句 三、程序返回、屏幕显示等语句1、RETURN语句…...
2、用命令行编译Qt程序生成可执行文件exe
一、创建源文件 1、新建一个文件夹,并创建一个txt文件 2、重命名为main.cpp 3、在main.cpp中添加如下代码 #include <QApplication> #include <QDialog> #include <QLabel> int main(int argc, char *argv[]) { QApplication a(argc, argv); QDi…...
【追求卓越08】算法--排序算法
引导 今天开始介绍我们在工作中经常遇到的算法--排序。排序算法有很多,我们主要介绍以下几种: 冒泡排序 插入排序 选择排序 归并排序 快速排序 计数排序 基数排序 桶排序 我们需要了解每一种算法的定义以及实现方式,并且掌握如何评…...
Linux fork笔试练习题
1.打印结果? #include <stdio.h> #include <unistd.h> #include <stdlib.h>int main() {int i0;for(;i<2;i){fork();printf("A\n");}exit(0); } 结果打印 A A A A A A 2.将上面的打印的\n去掉,结果如何? printf("…...
Jenkins 整合 Docker 自动化部署
Docker 安装 Jenkins 配置自动化部署 1. Docker 安装 Jenkins 1.1 拉取镜像文件 docker pull jenkins/jenkins1.2 创建挂载文件目录 mkdir -p $HOME/jenkins_home1.3 启动容器 docker run -d -p 8080:8080 -v $HOME/jenkins_home:/var/jenkins_home --name jenkins jenkin…...
日语AI面试高效通关秘籍:专业解读与青柚面试智能助攻
在如今就业市场竞争日益激烈的背景下,越来越多的求职者将目光投向了日本及中日双语岗位。但是,一场日语面试往往让许多人感到步履维艰。你是否也曾因为面试官抛出的“刁钻问题”而心生畏惧?面对生疏的日语交流环境,即便提前恶补了…...
CVPR 2025 MIMO: 支持视觉指代和像素grounding 的医学视觉语言模型
CVPR 2025 | MIMO:支持视觉指代和像素对齐的医学视觉语言模型 论文信息 标题:MIMO: A medical vision language model with visual referring multimodal input and pixel grounding multimodal output作者:Yanyuan Chen, Dexuan Xu, Yu Hu…...
YSYX学习记录(八)
C语言,练习0: 先创建一个文件夹,我用的是物理机: 安装build-essential 练习1: 我注释掉了 #include <stdio.h> 出现下面错误 在你的文本编辑器中打开ex1文件,随机修改或删除一部分,之后…...
ServerTrust 并非唯一
NSURLAuthenticationMethodServerTrust 只是 authenticationMethod 的冰山一角 要理解 NSURLAuthenticationMethodServerTrust, 首先要明白它只是 authenticationMethod 的选项之一, 并非唯一 1 先厘清概念 点说明authenticationMethodURLAuthenticationChallenge.protectionS…...
Python Ovito统计金刚石结构数量
大家好,我是小马老师。 本文介绍python ovito方法统计金刚石结构的方法。 Ovito Identify diamond structure命令可以识别和统计金刚石结构,但是无法直接输出结构的变化情况。 本文使用python调用ovito包的方法,可以持续统计各步的金刚石结构,具体代码如下: from ovito…...
Mysql8 忘记密码重置,以及问题解决
1.使用免密登录 找到配置MySQL文件,我的文件路径是/etc/mysql/my.cnf,有的人的是/etc/mysql/mysql.cnf 在里最后加入 skip-grant-tables重启MySQL服务 service mysql restartShutting down MySQL… SUCCESS! Starting MySQL… SUCCESS! 重启成功 2.登…...
【Nginx】使用 Nginx+Lua 实现基于 IP 的访问频率限制
使用 NginxLua 实现基于 IP 的访问频率限制 在高并发场景下,限制某个 IP 的访问频率是非常重要的,可以有效防止恶意攻击或错误配置导致的服务宕机。以下是一个详细的实现方案,使用 Nginx 和 Lua 脚本结合 Redis 来实现基于 IP 的访问频率限制…...
消息队列系统设计与实践全解析
文章目录 🚀 消息队列系统设计与实践全解析🔍 一、消息队列选型1.1 业务场景匹配矩阵1.2 吞吐量/延迟/可靠性权衡💡 权衡决策框架 1.3 运维复杂度评估🔧 运维成本降低策略 🏗️ 二、典型架构设计2.1 分布式事务最终一致…...
JDK 17 序列化是怎么回事
如何序列化?其实很简单,就是根据每个类型,用工厂类调用。逐个完成。 没什么漂亮的代码,只有有效、稳定的代码。 代码中调用toJson toJson 代码 mapper.writeValueAsString ObjectMapper DefaultSerializerProvider 一堆实…...
TCP/IP 网络编程 | 服务端 客户端的封装
设计模式 文章目录 设计模式一、socket.h 接口(interface)二、socket.cpp 实现(implementation)三、server.cpp 使用封装(main 函数)四、client.cpp 使用封装(main 函数)五、退出方法…...
