
kotlin
文章平均质量分 81
颐和园
这个作者很懒,什么都没留下…
展开
-
【深入kotlin】 - 与Java互操作:kotlin调用java
比如如下 Java 类:在 kotlin 中调用 Person:平台类型在 kotlin 中为了解决 Java 中所有引用类都是可空类型的问题,将所有来自于 java 的类型称为平台类型(platform types)。对这种类型kotlin 不再执行严格的非空检查。数组数组在 kotlin 中是,即不支持协变/逆变(out/in)。但 java 不同:Kotlin 中的数组更加安全,它不允许协变/逆变,你无法将一个 Array 赋给 Array(编译不通过)。数组参数也是如此。Java 中,允原创 2022-07-12 11:22:49 · 2402 阅读 · 1 评论 -
【深入kotlin】 - Flow 进阶
Flow 的收集动作总是发生在调用协程的上下文当中,而非定义 Flow 的上下文。运行输出结果如下(打开 debug 参数):可以看出 flow 运行于 collect 调用时的协程,即 runBlocking 开启的协程。这无疑会阻塞住主线程。因此我们可以将 flow 运行在其它上下文:程序报出如下异常:大意是收集线程发生在主线程,但 emit 线程发生在后台线程。withContext(Dispatchers.Default) 一句修改了 flow 的上下文,将 flow 的分发器修改到了 D原创 2022-06-06 15:47:36 · 1783 阅读 · 1 评论 -
【深入kotlin】 - 初识 Flow
ThreadLocal 是 Java 中线程间数据访问冲突中的一种解决方式,常用于取代锁。其会将线程间共享的数据复制为多份(每个线程的 ThreadLocal 数据维护在一张 map 表中,其中的 key 就是每个线程对象。这张 map 中,key 是 ThreadLocal 自己,value 是复制后的数据)。这样,每个线程操作一份数据,从而解决访问冲突。但在协程环境中,这个问题变得复杂。因为协程并没有和线程绑定,一个协程在执行过程中是可以切换线程的(例如之前 Dispatchers.Unconfined原创 2022-06-06 15:10:50 · 565 阅读 · 0 评论 -
【深入kotlin】 - 协程上下文、Job和CoroutineScope
协程调试打印协程名首先看这段代码:private fun log(msg: String) = println("[${Thread.currentThread().name}] $msg")fun main() = runBlocking<Unit> { val a = async { log("a") 10 } val b = async { log("b") 20 } log(" a*b = ${a.awiat()*b.awai原创 2022-05-02 21:11:19 · 1411 阅读 · 0 评论 -
【深入kotlin】 - 协程的取消
取消fun main() = runBlocking{ val job = GlobalScope.launch { repeat(200){ println(it) delay(500) } } delay(1000) println("to cancel the job.") job.cancel() // 取消job job.join() // 必须 join。此句作用是挂起协程,直至 job 完成才会真正取消 job printl原创 2022-05-02 21:08:11 · 1360 阅读 · 0 评论 -
【深入kotlin】 - 协程
协程是轻量级的fun main() = runBlocking{ repeat(100){ // 2 launch() { delay(1000) println("A") } } println("------end --------") // 1}首先打印 end 一行,因为前面启动的 launch 都是延迟执行的。repeat 函数重复调用语句块指定次数(100次)。用于每次都是启动另外的协程,这些协程都会延迟 1 秒打印,所以 1 秒后,100 个 A 基本上同原创 2022-05-02 21:06:56 · 974 阅读 · 0 评论 -
【深入kotlin】 - 创建协程
创建协程的方式主要有:launch()、async()、coroutineScope()、runBlocking() 。launch()创建一个异步协程(非阻塞),返回一个不带返回值的 job。fun main(){ GlobalScope.launch{// 默认 CorutineDispatcher 为 Dispatchers.Default delay(1000) // 仅可用于协程,而非线程 println("Halloween Special") // 1 } println原创 2022-04-02 13:41:13 · 2574 阅读 · 0 评论 -
【深入kotlin】- 协程
协程是一个类似于线程的概念,但也不完全相同,它是一种轻量级的线程,它比线程的概念更小,功能更加强大,方便我们以顺序执行的方式进行异步编程。一个线程可以拥有若干个协程,协程可以进行执行、挂起、延迟等操作。通过协程,我们可以获得比线程更大的控制权,却只需付出更低的代价。CoroutineScopeCoroutineScope 接口代表了协程的概念。GlobalScope 是其中一个实现。CoroutineScope 只有一个属性 coroutineContext,表示协程上下文。协程上下文/协程分发器C原创 2022-04-02 13:33:51 · 1889 阅读 · 0 评论 -
【深入kotlin】 - 反射的应用
到目前为止,我们都是通过反射获取类的信息,接下来我们能利用这些反射信息干什么呢?调用成员函数class MyClass { fun printSomething(name: String){ println("something: $name") } fun printNothing() { println("nothing") }}fun main(args:Array<string>) { val kc = MyClass:class val myClass原创 2022-04-02 13:32:09 · 1769 阅读 · 0 评论 -
【深入kotlin】 - KClass 特性深入研究
KClass 特性深入研究kotlin 反射 vs. Java 反射其实可以通过 KClass 获取属性的 java 特性,比如获得 get/set 方法和 field 的引用:class T(val x:Int)fun main(args: Array<String>) { println(T::x) // 打印:val com.kotlin.T.x: kotlin.Int println(T::x.javaGetter) // 打印:public final int com.原创 2022-02-23 19:19:27 · 926 阅读 · 0 评论 -
【深入kotlin】 - 方法引用和属性引用
反射kotlin 通过 kotlin-reflect.jar 提供对反射的支持。KClass通过类引用 KClassKClass 引用了 kotlin 类(具有内省能力)。类似于 Java 的 class 。要获取一个类的 KClass,通过类型名::class获得,而对应的 Java class 则通过类型名::class.java获得:fun main(args: Array<String>) { val c= String::class // 获取 KClass printl原创 2022-02-23 19:17:44 · 2358 阅读 · 0 评论 -
【深入kotlin】 - 匿名函数、闭包和接收者
匿名函数匿名函数没有名字,它很大程度上和 lambda 表达式类似,它的函数体既可以是语句块,又可以是表达式。同时,匿名函数的参数类型可以推断而不用指定,这点跟普通的函数不同。此外,匿名函数只能定义在函数体内。fun main(args:Array<String>){ fun(x:Int y:Int) = x+y // 1 val arr = arrayOf("hello","world","!") arr.filter(fun(item): Boolean = item.lengt原创 2022-02-23 19:14:47 · 1856 阅读 · 0 评论 -
【深入kotlin】 - lambda 表达式和高阶函数
函数式编程函数不依赖于任何类存在(从源代码级别上,从字节码层级,它仍然会依赖于类存在)。典型的如顶层函数。lambda 表达式lambda 表达式和 java 相同,它由被“箭头”符号(->)分隔的两个部分组成。箭头左边是括号包裹的参数列表(如果只有一个参数,括号可以省略),箭头右边是返回值类型:// 定义 lambda 表达式的类型(a: Int, b: Int) -> Int// 定义 lambda 表达式实例{ a,b -> a+b } // 花括号包裹,不能省略//原创 2022-01-16 17:14:41 · 1909 阅读 · 0 评论 -
【深入kotlin】 - 委托
委托委托不是 java 中的概念。它仅仅是一种设计模式,但是 kotlin 从语言层级上,通过 by 关键字提供了对委托模式的支持。类委托interface MyInteface { // 1 fun myPrint()}class MyInterfaceImpl(val name: String):MyInterface { //2 override fun myPring() { println(name) }}class MyClass(myInterface:MyInterf原创 2022-01-16 17:12:35 · 1975 阅读 · 0 评论 -
【深入kotlin】 - 枚举和注解
枚举所谓枚举,就是实例个数有限的类。定义enum class Season { SPRING, SUMMER, AUTUMN, WINTER}既然是class,当然也可以有主构造器,通过主构造器为所有实例的 temperature 赋予不同的初始值:enum class Season2(val temperature: Int) { SPRING(10), SUMMER(30),AUTUMN(30),WINTER(0)}当然也可以声明方法,而且可以在实例中重写方法:enum cl原创 2022-01-16 17:11:37 · 2481 阅读 · 0 评论 -
【深入kotlin】 - 嵌套类和内部类
嵌套类和内部类嵌套类kotlin 中,嵌套类和内部类是两种不同的类。所谓嵌套类是指定义在类体内的类。class OuterClass { private val name: String = "Anna" class NestedClass { fun nestedMethod() = "Attila" }}fun main(args: Array<String>){ println(OuterClass.NestedClass().nestedMethod()) //原创 2022-01-16 17:10:01 · 2468 阅读 · 0 评论 -
【深入kotlin】 - 范型
范型定义class A<T>(t:T){ var a: T init { this.a = t }}......var aa = A("kotlin")println(aa.a) // 打印 kotlin其中 A<String>("kotlin")可以根据类型推断简写写成 A("kotlin")。协变、逆变所谓协变、逆变是指一个对象被意外地降级为子类/升级为父类。特别是集合操作中,很容易出现此类问题。在 Java 中,List<String>原创 2021-12-09 16:08:33 · 909 阅读 · 0 评论 -
【深入kotlin】-数据类和密封类
kotlin原创 2021-12-09 15:54:18 · 2345 阅读 · 0 评论 -
【深入kotlin】- 伴生对象和扩展
kotlin原创 2021-12-09 15:49:36 · 2242 阅读 · 0 评论 -
【深入kotlin】- 接口和抽象类
kotlin原创 2021-12-09 15:46:41 · 2056 阅读 · 0 评论 -
【深入kotlin】- 类
类Kotlin 中定义类有些地方不同于 java。不需要 public一个类默认就是 public 的,所以不用显示地声明一个类为 public。不需要花括号如果一个类是空实现,可以不需要 {}class MyClass主构造方法Kotlin 规定每个类允许有一个主构造方法和多个次要构造方法。主构造方法是类名的一部分主构造方法定义类名之后,用 constructor 关键字声明:class MyClass contructor(username: String){ ...}这原创 2021-11-26 18:37:19 · 2507 阅读 · 0 评论 -
【深入kotlin】- 基础语法(三)
原义字符串同 swift 一样,kotlin 通过三引号"""支持原义符串,在原义字符串中,所有字符都按原样输出(包括换行),不需要进行转义。异常try/catch跟 java 不同,kotlin 中的 try 是个表达式而非语句,其返回值是 try / catch 块中的最后一个表达式。finally 块不返回。val s = "100"val result: Int? = try { parseInt(s)}catch(ex: NumberFormatException) { nu原创 2021-11-26 18:35:17 · 1667 阅读 · 0 评论 -
【深入kotlin】 - 基础语法(二)
Import同 Java 一样,位于同一包内的 class 不需要 import,否则需要 import。但可以指定别名:import com.example.xxx as zzz将 xxx 导入,并重命名为 zzz。判断if 比 swift 中有所扩展。比较特别的地方是支持三目运算(swift 中时 ? : 三目运算符):a = if(c==b) c else b甚至可以使用多行语句,最后一句的表达式自动返回(不需要 return):str = if(a<0) { printl原创 2021-11-26 18:33:15 · 1937 阅读 · 0 评论 -
【深入kotlin】 - 基础语法(一)
变量常量变量和 swift 一样,用 var 声明:var str:String = "hello"kotlin 同样支持类型推断,可以根据变量初始化值推断变量类型。因此上句可以写成:var str = "hello"常量和 swift 不同,用 val 而不是 let 声明:val a = 10这种常量值 kotlin 中叫做“不可变量”,表示该常量不可改变(除了声明的时候可以赋值)。此外还有一种常量,用 const val,二者的区别在于:const val 默认是 publi原创 2021-11-26 18:31:56 · 541 阅读 · 0 评论