Kotlin 进阶

这篇具有很好参考价值的文章主要介绍了Kotlin 进阶。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1.lambda 表达式

package com.jmj.myapp.lamdba

import javax.security.auth.callback.Callback

fun main() {

   1.test1 {
       println(this+1) 
   }


}

fun <T> T.test1(callback:T.() -> Unit) {
  this.callback()
}
package com.jmj.myapp.lamdba

import javax.security.auth.callback.Callback

fun main() {

    test(1) {
        println(this)
    }


}

fun <T> test(re: T, callback:T.() -> Unit) {
  re.callback()
}

2.通配符

package com.tiger.mykotlinapp.tongpeifu

fun main() {

    //*==Any
    val list: List<*> = listOf("123", null, 1)
    list.forEach {
        println(it is Int)
    }


}

3.where关键字

package com.tiger.mykotlinapp.whereDemo

fun main() {

    MyClass<Prm>(Prm())

        test<Prm>()
}

interface A
interface B
interface C

class Prm:A,B,C
//这是  和  三个满足才算
class MyClass<T> (var num:T) where T:A,T:B,T:C {
    fun test(num: T){
        println("输出:$num")
    }
}

fun <T>test() where T:A,T:B,T:C{

}

4.Out 和 In关键字

都是子类泛型变成父类

out是get方法,子类提升父类输出

in是set方法,子类提升父类输入

5.by委托

一般是委托接口和属性的

5.1 接口委托

package com.tiger.mykotlinapp.by

fun main() {
    println(HomeService(HomeDaoImpl(),ADaoImpl()).getAllData())
    println(HomeService(HomeDaoImpl(),ADaoImpl()).getById(123))
}
interface HomeDao{
    fun getAllData():List<String>
}

interface ADao{
    fun getById(id:Int):String
}

class HomeDaoImpl:HomeDao{
    override fun getAllData(): List<String> {
        return listOf("home")
    }

}


class ADaoImpl:ADao{
    override fun getById(id:Int): String {
        return id.toString();
    }

}
//将 HomeDaoImpl委托 给 HomeService  by后面跟的是实现类的对象  这里只能委托接口,抽象类和普通类委托不了
class HomeService(homeDaoImpl: HomeDaoImpl,aDaoImpl: ADaoImpl):HomeDao by homeDaoImpl,ADao by aDaoImpl{

    fun getRedisData():String{
        return "redis";
    }
}

5.2 属性委托

package com.tiger.mykotlinapp.by

import kotlin.properties.ReadWriteProperty
import kotlin.reflect.KProperty

fun main() {
    //将属性委托给类 顶层作用域委托
    var test:String by MyTestClass()
    test="213";
    println(test)
}

//test并不属于哪个类 就用nothing
//第一个泛型 是委托属性所属的那个类,第二个泛型是委托属性的类型
class MyTestClass:ReadWriteProperty<Nothing?,String>{
    private var myVar="";
    override fun getValue(thisRef: Nothing?, property: KProperty<*>): String {
        return myVar
    }

    override fun setValue(thisRef: Nothing?, property: KProperty<*>, value: String) {
        this.myVar = value
    }

}
package com.tiger.mykotlinapp.by

import kotlin.properties.ReadWriteProperty
import kotlin.reflect.KProperty

fun main() {
    A().apply {
        atest="123";
        println(atest)
    }
//    B().apply {
//        atest="asda";
//        println(atest)
//    }
}


class A{
    var atest:String by MyTestClass1()
}
//class B{
//    var atest:String by MyTestClass1()
//}

//test并不属于哪个类 就用nothing
//第一个泛型 是委托属性所属的那个类,第二个泛型是委托属性的类型
class MyTestClass1: ReadWriteProperty<A, String> {
    private var myVar = ""

    override fun getValue(thisRef: A, property: KProperty<*>): String {
        println("调用类委托的get")
        return myVar
    }

    override fun setValue(thisRef: A, property: KProperty<*>, value: String) {
        println("调用类委托的set")
       this.myVar= value
    }

}

Kotlin 进阶,Kotlin,kotlin,前端,javascript

5.3 延迟委托

 

package com.tiger.mykotlinapp.by

fun main() {
//    //延迟委托
//    //只能初始化一次。不能重复赋值,所以是val
//    val test by lazy{
//        println("初始化了Test")
//        "hello"
//    }
//    //线程安全只会初始化一次
//    println(test)
//    println(test)

    val a = Ab()
    println(a.aTest)
    println(a.aTest)


}

class Ab{
    val aTest:Boolean by lazy {
        println("1")
        println("1")
        println("1")
        println("1")
        println("1")
        println("1")
        true
    }
}

5.4 监听委托

package com.tiger.mykotlinapp.ObeserveWeiTuo

import kotlin.properties.Delegates

fun main() {
        var test by Delegates.observable("hello"){_,oldVal,newVal->
            //监听到test发生变化后调用的值
            println("oldval $oldVal")
            println("newVal $newVal")
        }
    test="tees"
    test="test"
    println(test)
}

 文章来源地址https://www.toymoban.com/news/detail-802072.html

到了这里,关于Kotlin 进阶的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【28】Kotlin语法进阶——使用协程编写高效的并发程序

    提示:此文章仅作为本人记录日常学习使用,若有存在错误或者不严谨得地方欢迎指正。 协程是Kotlin语言中很有代表性的一种并发设计模式,用于简化异步执行的代码。 协程和线程有点类似,可以简单地将它理解成一种轻量级的线程 。我们前面学习的线程是属于重量级的,

    2024年02月03日
    浏览(53)
  • kotlin如何接收前端传递过来的数据

    Kotlin 可以使用 Spring Boot 等框架来接收前端传递过来的数据。 在 Spring Boot 中,你可以使用 @RequestBody 注解来将前端传递的 JSON 格式数据转换为相应的 Kotlin 对象。 示例代码: 在上面的示例中, @RequestBody 注解会将前端传递的 JSON 数据转换为 User 对象。你可以在该方法中对数据

    2024年02月10日
    浏览(45)
  • Spring Boot进阶(79):使用Kotlin轻松打造高效的Spring Boot应用

            随着Java开发语言的发展,很多新的编程语言不断涌现,其中Kotlin备受开发者青睐,它是一种相对新的基于JVM的静态语言,支持Java虚拟机(JVM)和Android开发。Kotlin将Java语言中的一些缺点进行了优化,并增加了很多新的特性,因此在开发效率和代码可读性上具有很

    2024年02月08日
    浏览(53)
  • 蓝旭前端05:JavaScript进阶

    数据类型 基本数据类型:Number、String、Boolean、Null、Undefined等。 引用数据类型:Object、Array、Function等。 typeof操作符:返回数据类型的字符串形式。 变量 变量声明:var、let、const。区别:var没有块级作用域,let和const有块级作用域,const声明的变量不能修改。什么是块级作用

    2024年04月26日
    浏览(38)
  • 2023年web前端开发之JavaScript进阶(一)

    接上篇博客进行学习,通俗易懂,详细 博客地址: 2023年web前端开发之JavaScript基础(五)基础完结_努力的小周同学的博客-CSDN博客 学习 作用域 、变量提升、 闭包 等语言特征,加深对 JavaScript 的理解,掌握变量赋值、函数声明的简洁语法, 降低代码的冗余度 。 理解作用域对程序

    2024年02月03日
    浏览(57)
  • 【Kotlin】Kotlin 与 Java 互操作 ① ( 变量可空性 | Kotlin 类型映射 | Kotlin 访问私有属性 | Java 调用 Kotlin 函数 )

    在 Java 语言 中 , 任何 引用类型变量 都可以为 空 null ; Java 中 八种 基本数据类型 变量 的 默认值 为 0 或 false ; 但是在 Kotlin 语言 中 , 所有的 变量 都是引用类型变量 , 没有基本数据类型 , 默认情况下 所有的变量 都为 非空类型 ; 下面分别定义一个 Java 类 和 Kotlin 脚本 , 在 K

    2024年02月02日
    浏览(64)
  • Kotlin第一弹:Kotlin详细介绍

    会一直坚持写关于Kotlin的入门系列文章,赶紧关注一起学习吧! 目录 前言 Kotlin是什么? 一、为什么优先使用Kotlin进行Android开发? 二、Kotlin优先意味着什么? 三、Kotlin能做什么? 四、我们也使用Kotlin 五、Kotlin常见问题 六、Kotlin必知必会 总结 Kotlin 是一门用于现代多平台应

    2024年02月16日
    浏览(45)
  • kotlin基础--快速上手kotlin语言开发

    1.1 变量 var表示可变变量,val表示不可变变量,注意并不是常量。变量名写在前面,类型写在后面,编译器如果能推断出你的类型,那么类型是不用声明的 。 编译器自动推断类型。 空安全类型编译器报错 如果还是想给赋初始化值的话 注意:String和String?是两个完全不同的类

    2024年02月15日
    浏览(54)
  • kotlin下载慢-kotlin compiler embeddable

    在androidStudio中第一次使用kotlin里时,kotlin compiler embeddable下载很慢,可以去官网自己下载: kotlin的仓库 选择一个合适的版本,点击View All  下载如下jar,点击...sha1链接,并记录他的sha1地址,后面要用这个sha1地址在本地新建目录  在本机找到目录: C:Users用户名.gradlecach

    2024年02月07日
    浏览(40)
  • Kotlin系列一(快速入门,kotlin的数据类型)

    kontlin可以写脚本 创建一个\\\"script.kts\\\"文件 编写脚本内容 使用 kotlinc -script script.kts 命令运行kotlin脚本 创建一个文件\\\"HelloWorld.kt\\\" 编写内容 使用 kotlinc HelloWorld.kt 编译kotlin代码 使用 kotlin HelloWorld Kt运行编译后的字节码 使用\\\"var\\\"定义变量,变量定义后值可以改变,且可以在定义

    2024年02月03日
    浏览(42)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包