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
- 简介(数据类扩展方法区间)
- 空值安全
- 100%兼容java scala
- 函数式编程 JDK1.8 lambda表达式
- 协程(thread)
- DSL(领域特定语言)
- 简洁: 大大减少样板代码的数量
- 安全: 避免空指针异常等整个类的错误
- 互操作性: 充分利用 JVM、Android 和浏览器的现有库
- 工具友好: 可用任何 Java IDE 或者使用命令行构建
四丶Kotlin 的发展
- Android 第一开发语言
- Springboot2.0第一开发语言
五丶Kotlin 的前景
- Kotlin script(gradle).kts
- Java虚拟机应用
Web kotlinee
javafx - 前端开发 kotlinjs
- Android开发
- 支持开发ios
- kotlin Native程序(完全抛弃JVM虚拟机)
全栈工程师
六丶Kotlin 应用场景
Web前端
Web后端
Android移动端
Server脚本
桌面游戏
七丶打印“Hello World”
fun main() {
println("Hello World")
}
八丶学习资料
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.NotImplementedError: An operation is not implemented: Not yet implemented(代码片段