kotlin总结(代码片段)

王睿丶 王睿丶     2022-12-18     189

关键词:

原创不易,希望能得到一个赞,感谢各位!

1、Kotlin 介绍

一丶Kotlin 是什么?
Kotlin可以编译成Java字节码,也可以编译成JavaScript,方便在没有JVM的设备上运行。除此之外Kotlin还可以编译成二进制代码直接运行在机器上(例如嵌入式设备或 iOS)。

Kotlin已正式成为Android官方支持开发语言。

二丶Kotlin 简介
2011年7月,JetBrains推出Kotlin项目,这是一个面向JVM的新语言 ,它已被开发一年之久。JetBrains负责人Dmitry Jemerov说,大多数语言没有他们正在寻找的特性,Scala除外。但是,他指出了Scala的编译时间慢这一明显缺陷。Kotlin的既定目标之一是像Java一样快速编译。 2012年2月,JetBrains以Apache 2许可证开源此项目。

Jetbrains希望这个新语言能够推动IntelliJ IDEA的销售。

Kotlin v1.0于2016年2月15日发布。这被认为是第一个官方稳定版本,并且JetBrains已准备从该版本开始的长期向后兼容性。

在Google I/O 2017中,Google宣布在Android上为Kotlin提供一等支持。

三丶为什么使用 Kotlin

  1. 简介(数据类扩展方法区间)
  2. 空值安全
  3. 100%兼容java scala
  4. 函数式编程 JDK1.8 lambda表达式
  5. 协程(thread)
  6. DSL(领域特定语言)
  7. 简洁: 大大减少样板代码的数量
  8. 安全: 避免空指针异常等整个类的错误
  9. 互操作性: 充分利用 JVM、Android 和浏览器的现有库
  10. 工具友好: 可用任何 Java IDE 或者使用命令行构建

四丶Kotlin 的发展

  • Android 第一开发语言
  • Springboot2.0第一开发语言

五丶Kotlin 的前景

  1. Kotlin script(gradle).kts
  2. Java虚拟机应用
    Web kotlinee
    javafx
  3. 前端开发 kotlinjs
  4. Android开发
  5. 支持开发ios
  6. kotlin Native程序(完全抛弃JVM虚拟机)
    全栈工程师

六丶Kotlin 应用场景
Web前端
Web后端
Android移动端
Server脚本
桌面游戏

七丶打印“Hello World”

fun main() 
    println("Hello World")

八丶学习资料

官方文档
Kotlin源码
Kotlin官方博客

2、知识点总结

2.1、变量

Kotlin 变量
9/100
发布文章
qq_27494201
未选择任何文件

1丶语法规则、类型推导机制

Kotlin 支持类型推导机制,所以使用 val、var来声明变量

  • 关键字:val
    意思:声明一个不可变的变量
val age = 21;		
  • 关键字:var
    意思:声明一个可变的变量
var name = "wangrui"

🔺Kotlin 虽然拥有类型推导机制,但是并不能满足延迟赋值的场景,如下:


所以,就诞生了显式声明变量类型这个东西


Kotlin 完全抛弃了 Java 中的基本数据类型,全部使用了对象数据类型。在 Java 中 int 是关键字,而在 Kotlin 中 Int 变成了一个类,它拥有自己的方法和继承结构。
如图: Java 和 Kotlin 数据类型对照表

学到这里,小伙伴们一定会有疑问

2丶为什么要有 val 和 var 这样的设定

  • (1)为了解决 Java 中 final 关键字没有被合理使用的问题。
  • (2)当项目越来越复杂,参与开发的人越来越多时,你永远不知道一个可变的变量会在什么时候被谁修改了,即使它原本不应该被修改,这就经常会导致出现一些很难排查的问题

3丶什么时候用 val,什么时候用var呢?
永远优先使用 val 来声明一个变量,而当 val 没有办法满足你的需求时再使用 var。这样设计出来的程序会更加健壮,也更加符合高质量的编程规范

2.2、函数(普通函数)

1丶课前须知
大家阅读之前,要养成把方法理解为函数习惯。在Kotlin中 主要强调函数,所以我们只要把方法理解为函数即可。其次Kotlin 真的把函数玩的特别强大,希望大家好好学习本节内容!

2丶语法规则

  • 关键字:fun

3丶利用函数求两个数之间的最大值

fun main()
    val num1 = 10;
    val num2 = 20;
    println(getMax(num1,num2))


fun getMax(num1:Int,num2:Int): Int
    return max(num1,num2)

运行结果

代码分析:
上面的代码没什么难度,max() 函数是Kotlin 中的内置函数,返回的是两个参数里最大的数。

4丶Kotlin 语法糖
概念(很好理解,请用心阅读):当一个函数中只有一行代码时,Kotlin 允许我们不必编写函数体,可以直接将唯一的一行代码写在函数定义的尾部,中间用等号连接即可。

fun getMax(num1: Int,num2: Int): Int = max(num1,num2)

代码分析:
利用:语法糖‘ ’ 大括号去掉了,同时 return 也去掉了。

你以为这样就够简介了吗?不,往下看

fun getMax(num1: Int,num2: Int) = max(num1,num2)

代码分析:
利用:语法糖 + 类型推导机制,前面我们讲 Kotlin 变量 的时候,引入了这个概念,在赋值的时候 Kotlin 会智能推导出右边的类型。这样讲是不是瞬间就明白了上面的这行代码简化,所以我们这里可以直接省略掉返回值类型

5丶总结

好啦,那么 函数(也叫:普通函数) 的基础知识我们就先讲到这里。后面还会有 标准函数静态函数扩展函数这些都是属于 Kotlin 的高阶函数,学习要一步一步慢慢来,把这篇的文章好好理解一下,代码好好敲一下再继续学下去!

《上一章》:Kotlin 变量
《下一章》:虚位以待,正在努力编写中!

2.3、内置类型

一丶基本类型

  • 声明变量
  • 声明变量(类型自动推导)
  • 易混淆的 Long 类型标记
  • Kotlin 的数值转换
  • Kotlin 的字符串

声明变量

声明变量(类型自动推导)

易混淆的 Long 类型标记

Kotlin 的数值转换

Kotlin 的字符串

总结


二丶数组

  • 区别
  • 数组的创建
  • 数组的长度
  • 数组的读写
  • 数组的遍历写法一
  • 数组的遍历写法二
  • 数组的包含关系

区别:

数组的创建:

数组的长度

数组的读写:

数组的遍历写法一:

数组的遍历写法二:

数组的包含关系:

package com.wangrui.kotlin

fun main()

    // 方式一:创建一个可变长度的整型数组
    val c0 = intArrayOf(1,2,3,4,5)
    // 方式二:创建整型数组并且按照每个下标(0~4)依次+1 赋值给数组 c1
    val c1 = IntArray(5)it + 1
    // contentToString() — 将内容转换成字符串格式
    println(c1.contentToString());

    val c0 = intArrayOf(1,2,3,4,5);
    // 创建整型数组并且按照每个下标(0~4)依次(坐标+1)*3 赋值给数组c1
    val c1 = IntArray(5)(it + 1)*3

    println(c0.contentToString());
    println(c1.contentToString());

    val a = IntArray(5)
    // 得到集合长度
    println(a.size)

    val d = arrayOf("Hello","World")
    d[1] = "Kotlin"
    println("$d[0],$d[1]")

    val e = floatArrayOf(1f,2f,3f,4f,5f)
    // in—遍历
    for (a in e)
        println(a)
    

    // array.foreach()    高阶函数遍历
    //遍历集合e,并将每次循环得到的每个值赋给a,然后打印a
    e.forEach  a -> println(a) 


三丶区间

  • 区间的创建
  • 开区间
  • 倒序区间
  • 区间的迭代
  • 区间的包含关系
  • 区间的应用写法一
  • 区间的应用写法二

区间的创建

开区间

倒序区间

区间的迭代

区间的包含关系

区间的应用写法一:

区间的应用写法二:

package com.wangrui.kotlin

fun main()
    // in—包含
        if (1f in e)
        println("包含")
    

    if (20f !in e)
        println("不包含")
    

    //区间(正序)
    val intRange = 1..10
    val charRange = 'a'..'z'
    val longRange = 1L..100L

    val floatRange = 1f..2f
    val doubRange = 1.0..2.0

    // joinToString() — 加入并转成字符串,join — 加入
    println(intRange.joinToString())
    // toString() — 转成字符串
    println(floatRange.toString())



    // 止步——step
    val intRangeWitStep = 1..10 step 2
    val charRangeWithStep = 'a'..'z' step 2
    val longRanWitStep = 1L..100L step 5

    println(longRanWitStep.joinToString())



    // 倒序区间
    val intRangeReverse = 10 downTo 1
    val charRangeReverse = 'z' downTo 'a'
    val longRangeReverse = 100L downTo 1L

    println(longRangeReverse.joinToString())



    val array = intArrayOf(1,3,5,7)
    //遍历方式1
    // until — 直到,所以是 0 到 数组.size
    for (i in (0 until array.size))
        println(array[i])
    

    //遍历方式2
    // indices — 索引,所以 array[i] = 对应元素
    for (i in array.indices)
        println(array[i])
    



四丶集合框架

  • 简介
  • 集合框架的接口类型对比
  • 集合框架的创建【List】
  • 集合框架的创建【Map】
  • 集合实现类服用与类型别名
  • 集合框架的读写
  • 集合框架的修改
  • 集合框架的读写2
  • 集合框架的读写3
  • Pair
  • Triple
  • 思考题

简介

集合框架的接口类型对比

集合框架的创建【List】

集合框架的创建【Map】

集合实现类服用与类型别名

集合框架的读写

集合框架的修改

集合框架的读写2

集合框架的读写3

Pair

Triple

思考题

package com.wangrui.kotlin

fun main()
    //  创建List集合的方式一:不能添加元素或者删除元素
    val intList: List<Int> = listOf(1,2,3)
    //  创建List集合的方式二:可以添加元素或者删除元素
    val intList2: MutableList<Int> = mutableListOf(1,2,3)



    //  创建Map集合的方式一:不能添加元素或者删除元素
    //  Any等价于Java中的 Object
    //  to 可以理解为:Key to Value
    val map:Map<String,Any> = mapOf("name" to "benny","age" to 20)
    //  创建Map集合的方式二:可以添加元素或者删除元素
    val map2:Map<String,Any> = mutableMapOf("name" to "benny","age" to 20)



    val stringList:MutableList<String> = mutableListOf("98","99","100","num:1","num:2")
    //  对集合添加元素、删除元素
    for (i in 0..10)
    //      添加元素
//        stringList += "num:$i" // 等价于  stringList.add("num:$i")
    //结果为:[98, 99, 100, num:1, num:2, num:0, num:1, num:2, num:3, num:4, num:5, num:6, num:7, num:8, num:9, num:10]
    //      删除元素
        stringList -= "num:$i" // 等价于  stringList.remove("num:$i")
    //当上面代码注释后,结果为:[98, 99, 100]
    

    println(stringList)




    //  Map集合赋值
    stringList[5] = "HelloWorld"    //等价于 stringList.set(5,"HelloWorld")
    val valueAt5 = stringList[5]    //  等价于 String valueAt5 = stringList.get(5)

    val map = HashMap<String,Int>()
    map["Hello"] = 10
    //  '[]' 内的值实际上就是Key
    println(map["Hello"])


    //  解构:val (x,y) = pair
    val pair = "Hello" to "Kotlin"
    val pair2 = Pair("Hello","Kotlin")
    val first = pair.first
    val second = pair.second
    println(first)
    println(second)


    //  解构:val (x,y,z) = triple
    val triple = Triple("x",2,3.0)
    val first = triple.first
    val second = triple.second
    val third = triple.third

    println(first)
    println(second)
    println(third)

    
    
    // 作业:
    // 一、集合该如何遍历
    val intNumber: List<Int> = listOf(1,2,3,4,5,6)
    intNumber.forEacha -> println(a)

    //二、集合的包含关系如何判断?
    val intNumber2: List<Int> = listOf(1,2,3,4,5,6)
    if (4 in intNumber2)
        println("4包含于集合intNumber2")
    
    if (400 !in intNumber2)
        println("400不包含于集合intNumber2")
    

    //三丶Scala 选择自己全新构建了一套集合框架,为什么 Kotlin没有?




五丶函数

  • 函数的定义
  • 函数的类型
  • 函数的引用
  • 变长参数 【Java】与 【Kotlin】版
  • 多返回值
  • 默认参数
  • 默认参数 — 错误实例【X】
  • 解决办法【√】— 通过:具名参数

1、函数的定义

2、函数的类型

3、函数的引用


4、变长参数
【Java】

【Kotlin】

多返回值

默认参数

默认参数 — 错误实例【X】

解决办法【√】— 通过:具名参数

package com.wangrui.kotlin.bennyhuo

fun main(vararg args: String) 
//    println(args.contentToString())

    // 这时的x 为函数类型,具体为:(Foo, String, Long)->Any
    val x:(Foo, String, Long)->Any = Foo::bar
    val x0: Function3<Foo, String, Long, Any> = Foo::bar
    //三者等价
    // (Foo, String, Long)->Any = Foo.(String, Long)->Any = Function3<Foo, String, Long, Any>

//    val y: (Foo, String, Long) -> Any = x
    val y: Foo.(String,Long) -> Any = x
    val z: Function3<Foo, String, Long, Any> = x

    //调用yy函数,并传入x函数类型作为函数参数
    yy(y)

    //拿到 fun foo()   的引用
    val f: ()->Unit = ::foo
    //拿到 fun foo(p0: Int): String  return  ""  的引用
    val g: (Int) ->String = ::foo
    /**
     * 拿到:
         class Foo 
            fun bar(p0: String, p1: Long): Any
            println("one:$p0 Long:$p1")
            return ""
            
          
        的引用
     */
    val h: (Foo, String, Long)->Any
            = Foo::bar

    // 变长参数
    multiParameters(1, 2, 3, 4)

    //利用具名函数,将值准确传给 y: String
    defaultParameter(y = "Hello")

    //解构表达式
    val (a, b, c) = multiReturnValues() //实现 伪多返回值的场景
    val r = a + b
    val r1 = a + c



// p:是一个函数类型,这个函数其实就是 Foo::bar
fun yy(p: (Foo, String, Long) -> Any)
    p(Foo(), "Hello", 3L)   // Foo()指的是:类的引用,调用对应函数,并进行传参


class Foo 
    fun bar(p0: String, p1: Long): Any
        println("one:$p0 Long:$p1")
        return ""
    


fun foo()  
fun foo(p0: Int): String  return  "" 

//利用具名函数,将值准确传给 y: String
fun defaultParameter(x: Int = 5, y: String, z: Long = 0L)



// 变长参数
fun multiParameters(vararg ints: Int)
    println(ints.查看详情  

kotlin语法总结-泛型的使用(代码片段)

怎样声明一个函数来判断两个参数是否相等呢?如果参数是Int类型,则函数声明如下:privatefunisEqualsInt(a:Int,b:Int):Boolean     return(a==b)这个函数参数列表是两个Int类型,它只能比较两个Int类型参数是否相等... 查看详情

kotlin实战之letwithrunapplyalsotakeiftakeunlessrepeat源码总结(代码片段)

...是觉得将自己的云笔记分享出来吧~特别说明,kotlin系列文章均以Java差异为核心进行提炼,与Java相同部分不再列出。随着kotlin官方版本的迭代,文中有些语法可能会发生变化,请务必留意,语言领悟精髓... 查看详情

将app转换成100%kotlin总结(代码片段)

码字不易,转载请注明转自:http://blog.csdn.net/u011176685/article/details/52673390简书博客:http://www.jianshu.com/users/88579080227b题外话:国内社区逛多了,有点慢慢失去新鲜感。或许很多已经见多了.....推荐几个国外的网... 查看详情

kotlin语法总结:函数类型和高阶函数(代码片段)

Kotlin中每一个函数都有一个类型,称为“函数类型”,函数类型作为一种数据类型与基本数据类型在使用场景没有区别。可以声明变量,也可以作为其他函数的参数或者其他函数的返回值使用。函数类型函数类型就是... 查看详情

kotlin实战之面向对象特性全方位总结(代码片段)

...是觉得将自己的云笔记分享出来吧~特别说明,kotlin系列文章均以Java差异为核心进行提炼,与Java相同部分不再列出。随着kotlin官方版本的迭代,文中有些语法可能会发生变化,请务必留意,语言领悟精髓... 查看详情

kotlin实战之函数与lambda表达式总结(代码片段)

...是觉得将自己的云笔记分享出来吧~特别说明,kotlin系列文章均以Java差异为核心进行提炼,与Java相同部分不再列出。随着kotlin官方版本的迭代,文中有些语法可能会发生变化,请务必留意,语言领悟精髓... 查看详情

kotlin实战之泛型与逆变协变总结(代码片段)

...是觉得将自己的云笔记分享出来吧~特别说明,kotlin系列文章均以Java差异为核心进行提炼,与Java相同部分不再列出。随着kotlin官方版本的迭代,文中有些语法可能会发生变化,请务必留意,语言领悟精髓... 查看详情

kotiln基础语法总结(代码片段)

kotlin不仅支持编写在虚拟机上运行,而且还是一门跨平台的通用型语言,我们可以用Kotlin开发各种类型的原生应用,如Android,macOS,Windows,Javascript应用。Kotlin能脱离虚拟机层,直接编译成可以在Windows&... 查看详情

kotlin入门知识点总结常量,条件语句,string,方法,unit函数和nothing函数(代码片段)

...量2.条件语句2.1if/else2.2range2.3when3.String4.方法4.1默认传参4.kotlin字节码5.Unit函数6.Nothing参考材料从VIP课程2021-4-2kotlin专题,适合有java基础的人直接百度搜索码牛学院就可以找到1.变量常量和类型kotlin中,变量的定义是 查看详情

kotlin简单介绍以及使用总结(代码片段)

1.简介Kotlin是一种在Java虚拟机上运行的静态类型编程语言,被称之为Android世界的Swift,由JetBrains设计开发并开源。Kotlin可以编译成Java字节码,也可以编译成JavaScript,方便在没有JVM的设备上运行。在GoogleI/O2017中... 查看详情

将app转换成100%kotlin总结(代码片段)

...*************进入正题***********************************这只是关于Kotlin的一部分,点击这查看第二部分,在我讨论Kotlin语言设计的地方我已经关注Kotlin的发展有一段时间了,Kotlin是一个基于JVM,兼容Java的新的编程语言。随... 查看详情

kotlinjava对比学习总结(代码片段)

一、常量和变量 在java定义中定义变量;inta=2;a=35;doubleprice=19.28;price=20.88;在Kotlin中等价的定义变量:vara=2;a=35;varprice=19.28;price=20.88;Kotlin的只 查看详情

编程实践精华总结集锦系列2:springboot/maven/idea/java/kotlin/redis等等(代码片段)

GoQuickStart极简教程Go官网:https://golang.org/文档:https://golang.org/doc/开发环境配置下载Go:(官网)https://golang.org/dl/(国内镜像)https://golang.google.cn/dl/IDE:使用G 查看详情

金三银四必备,全面总结kotlin面试知识点(代码片段)

...很重视基础知识的考察,其中语言基础主要包括Java、Kotlin、C/C++三种编程语言。在小彭面试的经验中,发现很多同学的Kotlin语言能力只是停留在一些非常入门的语法使用上;在这篇文章里,我将为你浓缩总... 查看详情

2.7学习总结之androidjavatokotlin一(初识)(代码片段)

一、Kotlin的方便之处1、Kotlin可以直接使用id来呼叫操控相应的控件(textView.text="0" )  java(TextViewtextView = findViewById(R.id.textView;     textView.setText("0"); ))原因:使用了Kotlin的扩展的功能,importkotlinx.androi... 查看详情

kotlin标准库函数总结(apply函数|let函数|run函数|with函数|also函数|takeif函数|takeunless函数)(代码片段)

...so标准库函数六、takeIf标准库函数七、takeUnless标准库函数Kotlin语言中,在Standard.kt源码中,为所有类型定义了一批标准库函数,所有的Kotlin类型都可以调用这些函数;一、apply标准库 查看详情

kotlin协程简介(代码片段)

1. 什么是协程关于协程的定义有很多,在Kotlin语言中,协程比较合理的定义应该是一个线程框架(扔物线)或者说是一种并发设计模式(官方)。它是由官方设计的一套API方便开发者进行多线程开发。2.协程能干什么协程主要... 查看详情