Kotlin 总结

Posted 王睿丶

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Kotlin 总结相关的知识,希望对你有一定的参考价值。

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

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.forEach{a -> 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-从一个片段更改多个片段的小数位

如何更改片段 Kotlin

如何在kotlin的片段内显示网格视图?

如何在kotlin中从一个片段转到另一个片段?

在片段中单击按钮播放声音(Kotlin)[重复]

Kotlin学习之旅解决错误:kotlin.NotImplementedError: An operation is not implemented: Not yet implemented(代码片段