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

2024-01-04 10:30

本文主要是介绍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里的特性的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/569034

相关文章

从入门到精通MySQL联合查询

《从入门到精通MySQL联合查询》:本文主要介绍从入门到精通MySQL联合查询,本文通过实例代码给大家介绍的非常详细,需要的朋友可以参考下... 目录摘要1. 多表联合查询时mysql内部原理2. 内连接3. 外连接4. 自连接5. 子查询6. 合并查询7. 插入查询结果摘要前面我们学习了数据库设计时要满

Java设计模式---迭代器模式(Iterator)解读

《Java设计模式---迭代器模式(Iterator)解读》:本文主要介绍Java设计模式---迭代器模式(Iterator),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,... 目录1、迭代器(Iterator)1.1、结构1.2、常用方法1.3、本质1、解耦集合与遍历逻辑2、统一

Java 线程安全与 volatile与单例模式问题及解决方案

《Java线程安全与volatile与单例模式问题及解决方案》文章主要讲解线程安全问题的五个成因(调度随机、变量修改、非原子操作、内存可见性、指令重排序)及解决方案,强调使用volatile关键字... 目录什么是线程安全线程安全问题的产生与解决方案线程的调度是随机的多个线程对同一个变量进行修改线程的修改操

从入门到精通C++11 <chrono> 库特性

《从入门到精通C++11<chrono>库特性》chrono库是C++11中一个非常强大和实用的库,它为时间处理提供了丰富的功能和类型安全的接口,通过本文的介绍,我们了解了chrono库的基本概念... 目录一、引言1.1 为什么需要<chrono>库1.2<chrono>库的基本概念二、时间段(Durat

解析C++11 static_assert及与Boost库的关联从入门到精通

《解析C++11static_assert及与Boost库的关联从入门到精通》static_assert是C++中强大的编译时验证工具,它能够在编译阶段拦截不符合预期的类型或值,增强代码的健壮性,通... 目录一、背景知识:传统断言方法的局限性1.1 assert宏1.2 #error指令1.3 第三方解决

从入门到精通MySQL 数据库索引(实战案例)

《从入门到精通MySQL数据库索引(实战案例)》索引是数据库的目录,提升查询速度,主要类型包括BTree、Hash、全文、空间索引,需根据场景选择,建议用于高频查询、关联字段、排序等,避免重复率高或... 目录一、索引是什么?能干嘛?核心作用:二、索引的 4 种主要类型(附通俗例子)1. BTree 索引(

Redis 配置文件使用建议redis.conf 从入门到实战

《Redis配置文件使用建议redis.conf从入门到实战》Redis配置方式包括配置文件、命令行参数、运行时CONFIG命令,支持动态修改参数及持久化,常用项涉及端口、绑定、内存策略等,版本8... 目录一、Redis.conf 是什么?二、命令行方式传参(适用于测试)三、运行时动态修改配置(不重启服务

MySQL DQL从入门到精通

《MySQLDQL从入门到精通》通过DQL,我们可以从数据库中检索出所需的数据,进行各种复杂的数据分析和处理,本文将深入探讨MySQLDQL的各个方面,帮助你全面掌握这一重要技能,感兴趣的朋友跟随小... 目录一、DQL 基础:SELECT 语句入门二、数据过滤:WHERE 子句的使用三、结果排序:ORDE

Redis Cluster模式配置

《RedisCluster模式配置》:本文主要介绍RedisCluster模式配置,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录分片 一、分片的本质与核心价值二、分片实现方案对比 ‌三、分片算法详解1. ‌范围分片(顺序分片)‌2. ‌哈希分片3. ‌虚

Go学习记录之runtime包深入解析

《Go学习记录之runtime包深入解析》Go语言runtime包管理运行时环境,涵盖goroutine调度、内存分配、垃圾回收、类型信息等核心功能,:本文主要介绍Go学习记录之runtime包的... 目录前言:一、runtime包内容学习1、作用:① Goroutine和并发控制:② 垃圾回收:③ 栈和