kotlin 入门总结

目录

1、构造函数

2、数据类 data class,

3、object 单例类,相当于java线程安全的懒加载

4、companion object 伴生对象,类似于包装静态值的一个区域块

5、解构

6、空安全

    7、条件语句

8、集合 

9 属性和支持属性

    属性

    支持属性

10     扩展函数和扩展属性

11. 作用域函数:let、apply、with、run、also


1、构造函数


每个类都有一个主构造函数:

class Person constructor(firstName: String) { /*...*/ }

    主构造函数若没有访问修饰或注解则可以省略constructor关键字

class Person(firstName: String) { /*...*/ }

若有访问修饰符或注解,则不能省略constructor关键字

class Customer public @Inject constructor(name: String) { /*...*/ }


    主构造函数不能有代码块,若要有代码块则放入 init 代码块中,init代码块按顺序执行(初始化块按在类体中出现的顺序执行,与属性初始化器交错进行。)

class InitOrderDemo(name: String) {val firstProperty = "First property: $name".also(::println)init {println("First initializer block that prints $name")}val secondProperty = "Second property: ${name.length}".also(::println)init {println("Second initializer block that prints ${name.length}")}
}First property: hello
First initializer block that prints hello
Second property: 5
Second initializer block that prints 5

    次构造函数需带有constructor 关键字,并且必须直间或间接调用主构造,通过this 关键字,

class Person(val name: String) {val children: MutableList<Person> = mutableListOf()constructor(name: String, parent: Person) : this(name) {parent.children.add(this)}
}

 init 其实是主构造的一部分,所以顺序是 主-〉init-〉次
 若没写主构造函数,则次构造函数调用主构造是隐式调用的

2、数据类 data class,

data class Person(val name: String) {var age: Int = 0
}
  •     主构造函数必须有一个参数
  •     数据类会默认重写equals() 来比较内容是否想到,如A对象和B对象,name都是 “张三” 则相等
  •     重写hashCode()
  •     重写toString() 的话回打印类属性 如 :"User(name=John, age=42)". 
  •     支持解构
  •     支持属性copy()
  •     注意:上面的内容只与主构造声明的参数有关,即例子里面的name属性,而age会忽略(equals,hashcode、解构、copy)。

注:

  • 构成相等使用 == 运算符,并调用 equals() 来确定两个实例是否相等。
  • 引用相等使用 === 运算符,以检查两个引用是否指向同一对象。

3、object 单例类,相当于java线程安全的懒加载

object Repository {}


4、companion object 伴生对象,类似于包装静态值的一个区域块

class Repository {companion object {}
}

5、解构

  val(a,b)= person("A","B")  即解构声明,即将类部分分别解析赋值得到a=“A”,b=“B”。
    支持解构的,如 数据类,map,list,pair 等,
    普通类自定义支持解构要写:

    class Point(var x: Int, var y: Int) {operator fun component1(): Int {return x}operator fun component2(): Int {return y}}


6、空安全

用问号标示变量是否可空,如 var a:String? =“abc”

若操作可空变量,需要用到的方式

  •     if判断
  •     安全操作符 ?. 若为null 则返回空,则不调用后边的表达式
  •     空合并操作符 ?: 若为不为null 则返回本身调用,为null 则返回右边的
  •     非空断言 !! 明确告诉编译器,我确定它不为null,若为null 则抛空异常
  •     a?.let{}  结合let函数,若为null则不调用let
  •     as?  对象转换,若转换失败,及给null值

  7、条件语句


    判断语句 if..else.. 类似于java
    when语句,类似于java 的 switch语句,写法略有不同。else 相当于 default

when (x) {in 1..10 -> print("x is in the range")in validNumbers -> print("x is valid")!in 10..20 -> print("x is outside the range")else -> print("none of the above")
}

    循环语句 for while do..while 类似于java。
    在 Kotlin 中,if、when、for 和 while 均为表达式,它们有返回值

8、集合 


    List  有序重复    创建方式:listOf
    MutableList    创建方式:mutableListOf  兼容java型的创建 ArrayList()
    Set  无序不重复    创建方式:setOf
    MutableList    创建方式 mutableSetOf   兼容java HashSet()
    Map         创建方式:mapOf("one" to 1, "two" to 2)
    MutableMap    创建方式:mutableMapOf("a" to 1, "b" to 2)  兼容java HashMap()
    ArrayDeque(双端队列)创建方式:ArrayDeque()ArrayDeque(List)
    集合的高阶函数

  •     map{it * 2}   操作每一个元素(it代表集合中的每个元素),返回新的集合
  •     filter { it % 2 == 0 } 过滤元素,只有元素满足表达式的,才保留,it代表集合中的每个元素),返回新的集合
  •     reduce{sum, element -> sum + element } 累计计算,常用于计算集合中元素的总和、乘积等聚合操作
  •     foldfold(1) { acc, element -> acc * element } 类似于reduce,但是可以指定初始值
  •     forEach { println(it) }  遍历,没有返回值
  •     groupBy { it.department } 分租 groupBy函数用于将集合中的元素根据一个键选择器(以 Lambda 表达式形式表示)分组,返回一个以键为索引,值为分组后的元素列表的映射(Map)

    例子:

   data class User(val name: String, val department: String)val users = listOf(User("Alice", "HR"), User("Bob", "IT"), User("Charlie", "HR"))val groupedUsers = users.groupBy { it.department }println(groupedUsers) // 输出 {HR=[User(name=Alice, department=HR), User(name=Charlie, department=HR)],IT=[User(name=Bob, department=IT)]}    


9 属性和支持属性


    属性

默认提供 get 和 set 访问. val 只有get 访问器,  get和set可以自定义如:

class Person {var name: String = ""get() {println("Getting name")return field}set(value) {println("Setting name to $value")field = value}
}


    lateinit是 Kotlin 中的一个关键字,用于修饰非空类型的属性,它允许你延迟初始化这个属性。通常用于在类初始化时无法立即初始化某个属性,但可以保证在该属性真正被使用之前会被初始化的情况。例如,在依赖注入或者 Android 的视图绑定场景中,视图属性在onCreate方法执行之前是未初始化的,但在onCreate方法执行过程中会被初始化,这种情况下可以使用lateinit。 若检查延迟初始化的属性是否已经初始化,用 属性.isInitialized

    支持属性

_users即为 users的支持属性,外部访问时只能访问,而不能修改(因为外部访问时,返回的是不可变的List) 
private val _users = mutableListOf<User>()
val users: List<User>
      get() = _users


10     扩展函数和扩展属性

扩展函数

fun User.getFormattedUserName(): String {}


    扩展属性

val User.formattedUserName:Stringget() { }


11. 作用域函数:let、apply、with、run、also


    它们的唯一目的是在对象的上下文中执行代码块。当您在提供了 lambda 表达式的对象上调用这样的函数时,它会形成一个临时作用域。在这个作用域中,您可以访问没有其名称的对象.
    这些函数都执行相同的操作:在对象上执行代码块。不同的是这个对象在块内是如何变得可用的,以及整个表达式的结果是什么。

let函数

对象本身,it引用。返回值是let块中最后一行表达式的值。

     val text = "Hello, World!"val length = text.let { it.length }println(length) 
//text对象调用let函数,在let块内部通过it引用text,直接返回text的长度。

run函数

对象本身,this引用(可省略),返回值是run块中最后一行表达式的值。

     data class Person(var name: String, var age: Int)val person = Person("Alice", 30).run {name = "Bob"age += 5this}println("Name: ${person.name}, Age: ${person.age}")
//这里Person对象调用run函数,在run块内部通过this引用Person对象,
//修改了name和age属性,最后返回修改后的Person对象本身。

with函数

默认引用是入参对象,this来引用这个参数。返回值是with块中最后一行表达式的值。

     val person = Person("Charlie", 25)with(person) {println("Name: $name, Age: $age")}
//在这个例子中,with函数以person为参数,在with块内部通过this(也就是person)
//来访问name和age属性,这里不需要返回值,只是对person对象进行了信息打印操作。

apply函数

对象本身,this引用,返回操作过后的当前对象

     val person = Person("David", 35).apply {name = "Eve"age -= 5}println("Name: ${person.name}, Age: ${person.age}")
//这里Person对象调用apply函数,在apply块内部通过this引用Person对象,
//修改了name和age属性,最后返回修改后的Person对象本身。

also函数

对象本身,it 引用,返回原始对象 (注意,它的设计意图是对对象额外操作,不是改变其本身)

     val numbers = listOf(4, 5, 6).also {println("Original list: $it")}println("Numbers: $numbers")
//在这个例子中,listOf(4, 5, 6)对象调用also函数,在also块内部通过
//it引用这个对象并打印它,最后also函数返回原始的list对象,并且可以再次打印这个对象。
函数引用对象引用字段返回值
let调用该函数的对象it最后一个表达式的值
run调用该函数的对象this最后一个表达式的值
with传入的对象this最后一个表达式的值
apply调用该函数的对象this经过配置后的对象本身
also调用该函数的对象it原始对象本身

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

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

相关文章

kali的下载与配置

kali.org官网下载 选择VMware的版本下载&#xff0c;并解压&#xff0c;复制解压后的路径 在虚拟机中&#xff0c;点击文件&#xff0c;打开 默认的账户密码均为kali 修改密码 sudo passwd root 切换root用户 su root 查看IP ip addr IP:192.168.184.131 粘贴复制shiftinsert…

从图像识别到聊天机器人:Facebook AI的多领域应用

随着人工智能技术的快速发展&#xff0c;Facebook已在多个领域内广泛应用AI技术&#xff0c;以提升用户体验、提高效率并推动创新。从图像识别到聊天机器人&#xff0c;Facebook的AI应用涵盖了社交媒体的方方面面&#xff0c;下面我们将深入探讨这些应用的具体实现及其对用户生…

ecmp观察

文章目录 简述选路策略实验说明开始验证 简述 ECMP&#xff08;Equal Cost Multi Path&#xff09;等价多路径&#xff0c;又称等价路由。指到达同一个目的IP或者目的网段存在多条COST值相等的不同路由路径。在具有多条到达同一目的地的网络链路的环境中&#xff0c;传统路由技…

2.1 > Shell 是什么、如何更熟练的使用 Bash Shell

Shell 基础知识 Shell是计算机操作系统中的一个命令行解释器&#xff0c;由C语言编写&#xff0c;用于用户与操作系统之间进行交互。用户可以通过Shell输入命令&#xff0c;操作系统接收到这些命令后执行相应的操作。Shell一般还提供了编程语言的基本功能&#xff0c;允许用户…

在 VS Code 中轻松绘图:Draw.io Integration 插件详解

文章目录 在 VS Code 中轻松绘图&#xff1a;Draw.io Integration 插件详解一、什么是 Draw.io Integration 插件&#xff1f;二、插件安装指南1. 安装步骤2. 配置插件 三、如何使用 Draw.io Integration 插件&#xff1f;1. 创建新绘图文件2. 编辑现有图表3. 常用功能与技巧 四…

网安加·百家讲坛 | 徐一丁:金融机构网络安全合规浅析

作者简介&#xff1a;徐一丁&#xff0c;北京小西牛等保软件有限公司解决方案部总监&#xff0c;网络安全高级顾问。2000年开始从事网络安全工作&#xff0c;主要领域为网络安全法规标准研究、金融行业安全咨询与解决方案设计、信息科技风险管理评估等。对国家网络安全法规标准…

【数据结构与算法】《布隆过滤器:高效数据筛选的魔法工具》

标题&#xff1a;《布隆过滤器&#xff1a;高效数据筛选的魔法工具》 摘要&#xff1a;本文将带你深入了解布隆过滤器这一神奇的数据结构。从研究推荐系统中的已读内容排除和重复内容去重问题引入&#xff0c;详细介绍布隆过滤器的产生契机、设计思想、优缺点及用途。通过阅读…

机器视觉运动控制一体机在DELTA并联机械手视觉上下料应用

市场应用背景 DELTA并联机械手是由三个相同的支链所组成&#xff0c;每个支链包含一个转动关节和一个移动关节&#xff0c;具有结构紧凑、占地面积小、高速高灵活性等特点&#xff0c;可在有限的空间内进行高效的作业&#xff0c;广泛应用于柔性上下料、包装、分拣、装配等需要…

MyBatis 基础知识:配置文件、映射器与 SQL 示例详解

本篇博客将深入探讨 MyBatis 的基础知识&#xff0c;包括配置文件的设置、映射器的使用以及实际的 SQL 示例。 文章目录 前言 准备工作 根据主键删除 日志输出 ​编辑 预编译SQL SQL注入 ​编辑 参数占位符 新增员工 主键返回 更新 查询&#xff08;根据ID查询&#x…

世界前沿思想升命学说:鼠、牛、虎、兔、龙、蛇、马、羊、猴、鸡、狗、猪

在当今哲学的前沿探索中&#xff0c;山东济南的名人颜廷利教授的《升命学说》一书以其独到的见解和深刻的洞察力&#xff0c;为我们揭示了十二生肖背后的象征意义。这些生肖包括鼠、牛、虎、兔、龙、蛇、马、羊、猴、鸡、狗以及猪&#xff0c;每一种动物都承载着独特的文化寓意…

哥德巴赫猜想渐行渐远

我现在的工作&#xff0c;表明经典分析可能出了问题&#xff0c;如此则连Vinogradov的三素数定理都不成立了&#xff0c;更别说基于L-函数方程的陈氏定理“12”了。事实上即使L-函数方程成立&#xff0c;由于我指出Siegel定理不成立&#xff0c;陈景润和张益唐的工作就不成立。…

卡牌抽卡机小程序,带来新鲜有趣的拆卡体验

随着移动信息技术的发展&#xff0c;小程序得到了快速普及&#xff0c;遍布到了各行各业中&#xff0c;成为企业发展的利器。如今&#xff0c;卡牌抽卡机小程序层出不穷&#xff0c;为玩家带来了更多有趣的拆卡体验。 卡牌在今年中受到了广泛关注&#xff0c;“小马宝莉”等一…

Qt中使用线程之QRunnable

1、自定义1个子类继承自QRunnable 2、重写run方法&#xff0c;编写子线程的业务逻辑 3、使用QThreadPool的全局方法来开启这个线程 4、线程的回收不需要关注&#xff0c;由QThreadPool处理 5、缺点&#xff1a;无法使用信号槽机制 6、适合一些不需要和主线程通信的耗时的任…

如何使用的是github提供的Azure OpenAI服务

使用的是github提供的Azure OpenAI的服务gpt-4o 说明&#xff1a;使用的是github提供的Azure OpenAI的服务&#xff0c;可以无限薅羊毛。开源地址 进入&#xff1a; 地址 进入后点击 右上角“Get API key”按钮 点击“Get developer key” 选择Beta版本“Generate new to…

[Ansible实践笔记]自动化运维工具Ansible(一):初探ansibleansible的点对点模式

文章目录 Ansible介绍核心组件任务执行方式 实验前的准备更新拓展安装包仓库在ansible主机上配置ip与主机名的对应关系生成密钥对将公钥发送到被管理端&#xff0c;实现免密登录测试一下是否实现免密登录 常用工具ansibleansible—docansible—playbook 主要配置文件 Ansible 模…

【数据结构】快速排序(三种实现方式)

目录 一、基本思想 二、动图演示&#xff08;hoare版&#xff09; 三、思路分析&#xff08;图文&#xff09; 四、代码实现&#xff08;hoare版&#xff09; 五、易错提醒 六、相遇场景分析 6.1 ❥ 相遇位置一定比key要小的原因 6.2 ❥ 右边为key&#xff0c;左边先走 …

dd小程序如何监听props中对象的值

组件内代码 Component({mixins: [],data: {infoData:{}},props: {rowData:Object},didMount() {console.log(this.props.rowData,this.props.rowDatathis.props.rowData)this.setData({infoData:this.props.rowData})},didUpdate() {console.log(this.props.rowData)},didUnmo…

落实“双碳”行动,深兰科技推动分子能源技术在AI硬件产品领域的应用及产业化进程

10月21日&#xff0c;上海气候周分子能研究中心(筹)成立仪式在上海环境能源交易所举行。仪式上&#xff0c;深兰科技践行“双碳”目标&#xff0c;与上海东八能源技术有限公司签署分子能源AI应用产业化合作协议。 根据协议&#xff0c;国际分子能量发电开拓者、上海气候周分子能…

论当前的云计算

随着技术的不断进步和数字化转型的加速&#xff0c;云计算已经成为当今信息技术领域的重要支柱。本文将探讨当前云计算的发展现状、市场趋势、技术革新以及面临的挑战与机遇。 云计算的发展现状 云计算&#xff0c;作为一种通过网络提供可伸缩的、按需分配的计算资源服务模式&a…

TMGM平台可靠么?交易是否安全?

在选择外汇交易平台时&#xff0c;安全性与可靠性是投资者最关注的要素之一。作为全球知名的外汇及差价合约交易平台&#xff0c;TMGM&#xff08;tmgm-pt.com&#xff09;的安全性与可靠性可以从多个方面进行评估&#xff0c;包括监管环境、资金安全、客户服务、交易技术与服务…