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生产力助推器;

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

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

相关文章

23. Spring源码篇之环境变量Environment

简介 在开发过程中&#xff0c;我们通常会把一些变化的数据&#xff0c;或者说不同环境值不一样的数据抽离出来&#xff0c;代码可以根据需要通过配置动态的方式获取不同的值&#xff0c;这个值可以是在配置文件中&#xff0c;数据库中等 在spring中定义了一个统一的环境变量…

android 9 adb安装过程学习(三)

PackageManagerService 一、PackageManagerService.installStage 接下来&#xff0c;进入 PackageManagerService 阶段。从PackageInstallerSession.java的commitLocked调用 这里的 IPackageInstallObserver2 observer 是前面创建的本次 localObserver&#xff1a; 位置&…

详解FreeRTOS:互斥信号量和递归互斥信号量(高级篇—3)

目录 1、互斥信号量 1.1、互斥信号量运作机制 1.2、创建互斥信号量

[SpringCloud] SpringCloud配置中心的核心原理

SpringCloud是什么时候去拉取配置中心的配置中心客户端的配置信息为什么要写在bootstrap文件中对象中注入的属性是如何动态刷新的一些开源的配置中心是如何整合SpringCloud的 文章目录 1.从SpringBoot的启动过程说起1.1 大致过程 2.准备Environment的核心操作2.1 前置操作 3.pr…

NOI / 1.10编程基础之简单排序 提问05:分数线划定 c语言 结构体

描述 世博会志愿者的选拔工作正在 A 市如火如荼的进行。为了选拔最合适的人才&#xff0c;A市对所有报名的选手进行了笔试&#xff0c;笔试分数达到面试分数线的选手方可进入面试。面试分数线根据计划录取人数的150%划定&#xff0c;即如果计划录取m名志愿者&#xff0c;则面试…

SEOAI每周资讯和Linus思考 231127

欢迎查看 Linus筋斗云SEO 的每周资讯整理&#xff0c;本周的一些要点&#xff1a; Google11月核心更新和评论更新仍然没有结束9个搜索结果页的主要变化&#xff1a;图标、品牌、粉丝数、新模块GSC已索引页面狂掉&#xff1f;Google的问题&#xff0c;已修复黑五网一期间的搜索…

Doris物化视图

物化视图就是包含了查询结果的数据库对象,可能是对远程数据的本地copy,也可能是一个表或多表join后结果的行或列的子集,也可能是聚合后的结果。说白了,就是预先存储查询结果的一种数据库对象。 在Doris中的物化视图,就是查询结果预先存储起来的特殊的表。 物化视图的出现主…

《100 Java Mistakes and How to Avoid Them》笔记 2

继续阅读本书&#xff0c;编程语言处理数值都有可能出现问题&#xff0c;如溢出&#xff0c;整数的最大最小值不对称&#xff0c;Double.NaN 等。 由于 Java 学了 C&#xff0c;也用 0 开始的数字来表示 8 进制数&#xff0c;如 037, 010 分别是十进制的 31 和 8&#xff0c;这…

强化学习中的Q学习

Q学习&#xff08;Q-Learning&#xff09;是强化学习中的一种基于值的学习方法&#xff0c;用于在有限马尔可夫决策过程&#xff08;MDP&#xff09;中学习最优的动作策略。Q学习主要用于离散状态和离散动作的问题。 以下是Q学习的基本概念和步骤&#xff1a; Q-Value&#xf…

Android控件全解手册 - 实现抽奖大转盘

Unity3D特效百例案例项目实战源码Android-Unity实战问题汇总游戏脚本-辅助自动化Android控件全解手册再战Android系列

pkl文件的简介(Python中的Pickle)

文章目录 Pickle模块简介Pickle模块的使用 最近从Github上下载了一个预训练好的Faster-RCNN模型用于科研任务&#xff0c;突然对该文件的格式&#xff0c;.pkl文件产生了一丝疑惑&#xff0c;便去特意了解了一下该格式的文件的含义&#xff0c;下面与大家共享。 Pickle模块简介…

修改element的抽屉<el-drawer的宽度

Drawer 抽屉 有些时候, Dialog 组件并不满足我们的需求, 比如你的表单很长, 亦或是你需要临时展示一些文档, Drawer 拥有和 Dialog 几乎相同的 API, 在 UI 上带来不一样的体验. 我们通过el-button来显示Drawer&#xff0c;通过visible.sync来控制Drawer的显示状态。通过设置si…

在Spring Boot中隔离@Async异步任务的线程池

在异步任务执行的时候&#xff0c;我们知道其背后都有一个线程池来执行任务&#xff0c;但是为了控制异步任务的并发不影响到应用的正常运作&#xff0c;我们需要对线程池做好相关的配置&#xff0c;以防资源过度使用。这个时候我们就考虑将线程池进行隔离了。 那么我们为啥要…

【数据结构初阶】单链表

各位读者老爷好&#xff0c;鼠鼠我又来了哈。鼠鼠我呀现在来基于C语言实现以下单链表&#xff0c;希望对你有所帮助&#xff01; 目录 1.链表的概念及结构 2.链表的分类 3.无头单向非循环链表的实现 3.1.单链表打印 3.2.单链表尾插 3.3.单链表头插 3.4.单链表尾删 3.5…

在OpenCV中基于深度学习的边缘检测

引言 如何在OpenCV中使用基于深度学习的边缘检测&#xff0c;它比目前流行的canny边缘检测器更精确。边缘检测在许多用例中是有用的&#xff0c;如视觉显著性检测&#xff0c;目标检测&#xff0c;跟踪和运动分析&#xff0c;结构从运动&#xff0c;3D重建&#xff0c;自动驾驶…

MyBatis-Plus及多数据源入门教程

开发环境配置 JDK 1.8、Maven 3.8.8、 IDEA CE 2023.2、MySQL 8.0.34 框架介绍 MyBatis-Plus&#xff08;简称 MP&#xff09;是一个 MyBatis的增强工具&#xff0c;在 MyBatis 的基础上只做增强不做改变&#xff0c;为简化开发、提高效率而生。MyBatis 是一款非常优秀的开源…

训练 CNN 对 CIFAR-10 数据中的图像进行分类

1. 加载 CIFAR-10 数据库 import keras from keras.datasets import cifar10# 加载预先处理的训练数据和测试数据 (x_train, y_train), (x_test, y_test) cifar10.load_data() 2. 可视化前 24 个训练图像 import numpy as np import matplotlib.pyplot as plt %matplotlib …

leetcode:506. 相对名次

一、题目 函数原型&#xff1a;char** findRelativeRanks(int* score, int scoreSize, int* returnSize) 二、思路 创建一个新的数组newscore&#xff0c;将原数组数据拷贝到新数组&#xff0c;降序排序新数组。 遍历原数组&#xff0c;在新数组中找到原数组中数据在新数组中的…

优雅使用docker-compose部署Skywalking

Skywalking使用docker-compose部署 version: 3.1 services: // 部署elasetic search 用于存储获取的应用信息与日志elasticsearch:image: elasticsearch:7.13.3container_name: elasticsearchprivileged: trueenvironment:- "cluster.nameelasticsearch" #设置集群名…

算法通关村第十二关-黄金挑战字符串冲刺题

最长公共前缀 描述 : 编写一个函数来查找字符串数组中的最长公共前缀。 如果不存在公共前缀&#xff0c;返回空字符串 ""。 题目 : LeetCode 14.最长公共前缀 : 分析 : 第一种方式&#xff0c;我们可以竖着比较&#xff0c;如图所示&#xff0c;每前进一个位置就…