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:String
    get() { }


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 += 5
         this
     }
     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原始对象本身

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

HarmonyOS Next模拟器异常问题及解决方法

1、问题1&#xff1a;Failed to get the device apiVersion. 解决方法&#xff1a;关闭模拟器清除用户数据重启

【java】数组(超详细总结)

目录 一.一维数组的定义 1.创建数组 2.初始化数组 二.数组的使用 1.访问数组 2.遍历数组 3.修改数据内容 三.有关数组方法的使用 1.toString 2. copyOf 四.查找数组中的元素 1.顺序查找 2.二分查找binarySearch 五.数组排序 1.冒泡排序 2.排序方法sort 六.数组逆置…

redis的配置文件解析

我的后端学习大纲 我的Redis学习大纲 1.1.Redis的配置文件&#xff1a; 1.Redis的配置文件名称是&#xff1a;redis.conf 2.在vim这个配置文件的时候&#xff0c;默认是不显示行号的&#xff0c;可以编辑下面这个文件&#xff0c;末尾加上set nu&#xff0c;就会显示行号: 1.…

React源码03 - React 中的更新

03 - React 中的更新 React 中创建更新的方式&#xff1a; 初次渲染&#xff1a;ReactDOM.render、ReactDOM.hydrate 后续更新&#xff1a;setState、forceUpdate 1. ReactDOM.render() 先创建 ReactRoot 顶点对象然后创建 FiberRoot 和 RootFiber创建更新&#xff0c;使应用进…

Qt | http获取网页文件(小项目)

点击上方"蓝字"关注我们 ctrl+r 运行 URL可以自己替换一个试一试 【源码获取】 链接:https://pan.baidu.com/s/1QzHKZPXjkpx2p5TWUS_acA?pwd=5xsd 提取码:5xsd 01、QProgressDialog >>> QProgressDialog 是 Qt 框架中的一个类,主要用于显示一个进…

Java使用dom4j生成kml(xml)文件遇到No such namespace prefix: xxx is in scope on:问题解决

介绍addAttribute和addNamepsace: addAttribute 方法 addAttribute 方法用于给XML元素添加属性。属性&#xff08;Attributes&#xff09;是元素的修饰符&#xff0c;提供了关于元素的额外信息&#xff0c;并且位于元素的开始标签中。属性通常用于指定元素的行为或样式&#…

Golang | Leetcode Golang题解之第497题非重叠矩形中的随机点

题目&#xff1a; 题解&#xff1a; type Solution struct {rects [][]intsum []int }func Constructor(rects [][]int) Solution {sum : make([]int, len(rects)1)for i, r : range rects {a, b, x, y : r[0], r[1], r[2], r[3]sum[i1] sum[i] (x-a1)*(y-b1)}return Sol…

ReactOS系统中搜索给定长度的空间地址区间中的二叉树

搜索给定长度的空间地址区间 //搜索给定长度的空间地址区间 MmFindGap MmFindGapTopDown PVOID NTAPI MmFindGap(PMADDRESS_SPACE AddressSpace,ULONG_PTR Length,ULONG_PTR Granularity,BOOLEAN TopDown );PMADDRESS_SPACE AddressSpace,//该进程用户空间 ULONG_PTR Length,…

JavaScript入门中-流程控制语句

本文转载自&#xff1a;https://fangcaicoding.cn/article/52 大家好&#xff01;我是方才&#xff0c;目前是8人后端研发团队的负责人&#xff0c;拥有6年后端经验&3年团队管理经验&#xff0c;截止目前面试过近200位候选人&#xff0c;主导过单表上10亿、累计上100亿数据…

echart改变最后一个节点的图标

需求 在折线图的最后一个节点增加一个gif动图表示增长 一、静态图的使用 采用symbol属性进行设置&#xff0c;结果就是只能展示静态图 无法插入gif series: [{data: [150, 230, 224, 218, 135, 147, {value:200,symbol:image://https://ylxstatic.storage.ylingxin.com/va…

PostgreSQL数据库查看shared buffer配置

哈喽&#xff0c;大家好&#xff0c;我是木头左&#xff01; PostgreSQL是一个功能强大的开源关系型数据库管理系统&#xff0c;广泛应用于各种规模的应用程序。在PostgreSQL中&#xff0c;shared buffer是一个重要的性能调优参数&#xff0c;它直接影响到数据库查询的性能。本…

【信息论基础第六讲】离散无记忆信源等长编码包括典型序列和等长信源编码定理

一、信源编码的数学模型 我们知道信源的输出是消息序列&#xff0c;对于信源进行编码就是用码字集来表示消息集&#xff0c;也就是要进行从消息集到码字集的映射。 根据码字的特征我们又将其分为D元码&#xff0c;等长码&#xff0c;不等长码&#xff0c;唯一可译码。 我们通过…

使用Yolov10和Ollama增强OCR

1. 训练自定义 Yolov10 数据集 利用物体检测增强 OCR 的第一步是在数据集上训练自定义 YOLO 模型。YOLO&#xff08;只看一遍&#xff09;是一种功能强大的实时对象检测模型&#xff0c;它将图像划分为网格&#xff0c;使其能够在一次前向传递中识别多个对象。这种方法非常适合…

Redis遇到Hash冲突怎么办?

这是小伙伴之前遇到的一个面试题&#xff0c;感觉也是一个经典八股&#xff0c;和大伙分享下。 一 什么是 Hash 冲突 Hash 冲突&#xff0c;也称为 Hash 碰撞&#xff0c;是指不同的关键字通过 Hash 函数计算得到了相同的 Hash 地址。 Hash 冲突在 Hash 表中是不可避免的&am…

eNSP网络基本配置

1.配置设备名称 网络上一般不会配属一台设备&#xff0c;管理员需要对这些设备进行统一管理。在进行设备调试的时候&#xff0c;首要任务是配置设备名称&#xff0c;设备名称用来唯一标识一台设备。 例如通过以下操作将设备名称设置为testA &#xff1f; //可以查看用户视图…

AnaTraf | 提升网络性能:深入解析网络关键指标监控、TCP重传与TCP握手时间

AnaTraf 网络性能监控系统NPM | 全流量回溯分析 | 网络故障排除工具 在当今的数字化时代&#xff0c;网络的稳定性和性能对企业的运营效率至关重要。无论是内部通信、应用程序的运行&#xff0c;还是对外提供服务&#xff0c;网络都发挥着关键作用。对于网络工程师或IT运维人员…

雨情教务排课系统源码

PC端的雨情教务排课系统&#xff0c;是一款集功能性、实用性与便捷性于一体的教育管理工具。它全面支持班级设置功能&#xff0c;能够轻松管理不同年级、不同专业的班级信息&#xff0c;为后续的排课工作奠定坚实基础。在课程设置方面&#xff0c;系统允许管理者根据教学计划&a…

安装OpenResty

OpenResty OpenResty 是一个基于 Nginx的高性能 Web 平台&#xff0c;用于方便地搭建能够处理超高并发、扩展性极高的动态 Web 应用、Web 服务和动态网关。具备下列特点&#xff1a; 具备Nginx的完整功能 基于Lua语言进行扩展&#xff0c;集成了大量精良的 Lua 库、第三方模块…

Java最全面试题->Java基础面试题->JavaWeb面试题->Git/SVN面试题

文章目录 Git/SVN面试题Git和SVN有什么区别&#xff1f;SVN优缺点&#xff1f;Git优缺点&#xff1f;说一下Git创建分支的步骤&#xff1f;说一下Git合并的两种方法以及区别&#xff1f;Git如何查看文件的提交历史和分支的提交历史?什么是 git stash&#xff1f;什么是git sta…

uniapp修改input中placeholder样式

Uniapp官方提供了两种修改的属性方法&#xff0c;但经过测试&#xff0c;只有 placeholder-class 属性能够生效 <input placeholder"请输入手机验证码" placeholder-class"input-placeholder"/><!-- css --> <style lang"scss" s…