美文网首页
Kotlin高级特性

Kotlin高级特性

作者: HolenZhou | 来源:发表于2020-04-28 20:51 被阅读0次

委托

委托模式是软件设计模式中的一项基本技巧。在委托模式中,有两个对象参与处理同一个请求,接受请求的对象将请求委托给另一个对象来处理。

Kotlin 直接支持委托模式,更加优雅,简洁。Kotlin 通过关键字 by 实现委托。

  • 类委托
  • 委托属性
class App : Application() {
    val database: SQLiteOpenHelper by lazy {
        MyDatabaseHelper(applicationContext)
    }
    override fun onCreate() {
        super.onCreate()
        val db = database.writableDatabase
} }

Kotlin 的标准库中已经内置了很多工厂方法来实现属性的委托。
延迟属性 Lazy
第一次使用时候,执行表达式

Elvis 操作符 ?:
a?.b ?: c
?.的优先级高于?:

有时要修改某类,但不改变原类并且不显式声明子类.
对于这种情况,Java使用匿名内部类,
而Kotlin使用对象表达式(object expressions)

对象声明(object declarations)
Object 声明用来定义单例

伴生对象(companion object)
Companion Objects中定义的成员类似于Java中的静态成员
Kotlin中没有static关键字

特殊函数:
with

with是一个非常有用的函数,它包含在Kotlin的标准库中。它接收一个对象和一个扩展函数作为它的参数,然后使这个对象扩展这个函数。这表示所有我们在括号中编写的代码都是作为对象(第一个参数)的一个扩展函数,我们可以就像作为this一样使用所有它的public方法和属性。当我们针对同一个对象做很多操作的时候这个非常有利于简化代码。
内联函数与普通的函数有点不同。一个内联函数会在编译的时候被替换掉,而不是真正的方法调用。这在一些情况下可以减少内存分配和运行时开销。

inline fun <T> with(t: T, body: T.() -> Unit) { t.body() }

内联函数


操作符重载
重载操作符的函数要用operator修饰符标记

data class Point(val x: Int, val y: Int)

operator fun Point.unaryPlus() = 20
operator fun Point.get(a:Int) = y

fun main(args: Array<String>) {
    val point = Point(-5, 2)
    println(+point)
    println(point[100]);
}

输出为:
20
2

集合和函数操作符
any count flatMap map merge zip

Kotlin的扩展是静态解析的,不具备面向对象的多态的特性


Kotlin可以直接调用C的方法

官方团队给我们提供的库



map的key为id

在Kotlin中一切都是表达式,也就是说一切都返回一个值

泛型

class TypedClass<T>(parameter: T) {
    val value: T = parameter
}

上面可传参数null,下面不可以

class TypedClass<T : Context>(parameter: T) {
    val value: T = parameter
}

泛型函数

fun <T> typedFunction(item: T): List<T> {
    ...
}

变体
out 来针对协变
in 来针对逆变

let函数在处理可null对象的时候是非常有用的

if (forecast != null) dataMapper.convertDayToDomain(forecast) el
se null
forecast?.let { dataMapper.convertDayToDomain(it) }

apply
可以避免创建builder的 方式来使用,因为对象调用的函数可以根据自己的需要来初始化自己,然
后 apply 函数会返回它同一个对象

val textView = TextView(context).apply {
    text = "Hello"
hint = "Hint"
    textColor = android.R.color.white
}

SAM conversions
When an object implements a SAM interface (one with a Single Abstract Method), you can pass a lambda instead. Read more about SAM-conversions.

lazy{ ... } 只能用在val类型, lateinit 只能用在var类型
可以参考lazy函数的实现以及Lazy接口的源码

相关文章

  • kotlin高级特性

    Kotlin语法的高级特性异常强大,代码异常简洁,如果你在项目中能熟练使用各种kotlin高级特性后,你会发现,你...

  • Kotlin高级特性

    委托 委托模式是软件设计模式中的一项基本技巧。在委托模式中,有两个对象参与处理同一个请求,接受请求的对象将请求委托...

  • kotlin - 高级特性

    kotlin 上手很简单,因为可以完美支持 java ,和 java 比较像的缘故,我们熟悉下 kotlin 的语...

  • Kotlin 中的 let, with, run, apply,

    前言 和严格古老的 Java 相比,Kotlin 中额外提供了不少高级语法特性。这些高级特性中,定义于 Kotli...

  • kotlin的内联函数的使用

    kotlin的内联函数属于kotlin的高级特性了,也是不同于java的区别之一;至于为什么kotlin要使用内联...

  • Kotlin高级特性(二)

    一、集合操作符 Kotlin中可以通过集合操作符直接对集合进行操作,从而得到想要的结果。 map:对集合中的数据做...

  • Kotlin-简约之美-进阶篇(十五):let、with、run

    @[toc]相比Java, Kotlin提供了不少高级语法特性。对于一个Kotlin的初学者来说经常会写出一些不够...

  • Kotlin系列之let、with、run、apply、also

    简述: 相比Java, Kotlin提供了不少高级语法特性。对于一个Kotlin的初学者来说经常会写出一些不够优雅...

  • Kotlin-let、with、run、apply、also函数

    简述: 相比Java, Kotlin提供了不少高级语法特性。对于一个Kotlin的初学者来说经常会写出一些不够优雅...

  • 31 天,从浅到深轻松学习 Kotlin

    这篇文章介绍开发者用 31 天学习 Kotlin 的心得,深入浅出地介绍了 Kotlin 的一些基本特性以及高级用...

网友评论

      本文标题:Kotlin高级特性

      本文链接:https://www.haomeiwen.com/subject/vzasaxtx.html