kotlin语法总结(二)

2023-11-09

上一章地址

kotlin语法总结(一)

文章目录


前言

这章接着上一章语法总结继续讲解,主要讲kotlin和java不一样的地方


(40)嵌套类

(41)数据类 data class 提供toString,equals,hashCode个性化实现,==符号比较值,为每个属性生成operator修饰的componentN()方法,支持解构,生成copy方法,方便对象复制

class playerScore(val experience:Int,val level:Int) {
    operator fun component1() = experience
    operator fun component2() = level
}

fun main() {
    //解构
    val(x,y) = playerScore(1,2)
    println(x)
    println(y)
}
  • 数据类必须有至少一个参数数的主构造函数
  • 数据类的主构造函数参数必须是val或var
  • 数据类不能使用abstract、open、sealed和inner修饰
data class dataTest(var x:Int, var y:Int){
    val isInB = x>0 && y>0
}

(42)枚举类 enum class

(43)运算符重载
在这里插入图片描述

(44)密封类·sealed class(一种特殊的抽象类)

  • 密封类的直接子类必须和密封类在同一个文件中
  • 密封类的间接子类可以在不同文件中

(45)接口 interface,所有的属性和函数实现都需要override关键字

interface Moveable{
    var maxSpeed : Int
        get() = (0..4).shuffled().last()
        set(value) {}
    var wheel : Int
    fun move(moveable: Moveable):String
}

class Car(
    _name:String,
    override var wheel : Int = 4
):Moveable{
    override var maxSpeed: Int
        get() = super.maxSpeed
        set(value) {}
    override fun move(moveable: Moveable): String {
        TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
    }
}

(46)抽象类 abstract

abstract class Gun(val range:Int){
    abstract fun pullA():String
}

class AK47(val pr:Int):Gun(400),Moveable{

    override fun move(mo: Moveable): String {
        TODO("not implemented")
    }

    override val max: Int
        get() = super.max
    override var wheel: Int
        get() = TODO("not implemented") //To change initializer of created properties use File | Settings | File Templates.
        set(value) {}
    override fun pullA(): String {
        TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
    }
}

(47)泛型

class fanXing5<T:Human>(vararg item:T){
    var ab = false
    private var sub : Array<out T> = item

    fun tech(index: Int):T?{
        return sub[index].takeIf { ab }
    }

    //return -> R
    //业务:取元素时把元素进行修改T->R
    fun <R>tech(index: Int,suba:(T) -> R):R?{
        return suba(sub[index]).takeIf { ab }
    }
    //a[i] --> a.get(i)
    operator fun get(index: Int):T? = sub[index]?.takeIf { ab }
}
  • operator:运算符重载
  • 父类泛型对象可赋值给子类泛型对象:
  • 子类泛型对象可赋值给父类泛型对象:

(48)扩展函数:不直接修改类定义的情况增加类的功能,封装频率使用较高的代码,字节码中被编译成静态方法

fun Any.easyPrint01() = println(this)
fun Any.easyPrint02():Any{
    println(this)
    return this
}
fun <T> T.easyPrint03():T{
    println(this)
    return this
}

(49)扩展属性

val String.numVowels
    get() = count { "aeiou".contains(it) }

(50)infix中缀函数

  • map中1 to "one"就是中缀表达式
  • 使用infix的条件(1)只有一个参数(2)方法前加infix(3)成员方法或者扩展方法

(51)DSL领域特定语言,android中可代替xml动态实现布局(非必要),kotlin中实现DSL需要两样东西

  • 扩展函数

  • 带接收者的Lambda表达式build:StringBuilder.()->Unit

      (调用者类型.(参数类型)->返回值类型)
    

(52)函数式编程:变换、过滤、合并

  • 变换:map和flatMap
fun main() {
    val animals = listOf("a","b","c")
    //不可变副本在链上函数间的传递
    val babys = animals
        .map { animal -> "A baby $animal" }
        .map { baby -> "aaa $baby" }
    println(animals)
    println(babys)

    val animalLength = animals.map { it.length }
    println(animalLength)

    val flat = listOf(listOf("111","123","123"), listOf("111","45","435")).flatMap { it.filter { it.contains("1") } }
    println(flat)

    val aa = listOf("123","211","3234").filter { it.contains("1") }
    println(aa)
}
  • 过滤 filter
    val num = listOf(3,4,5,6,7,8,9,11,13)
    val pri = num.filter { number ->
    (2 until number).map { number%it }.none { it==0 }
}
    println(pri)
  • 合并 zip fold reduce
    val aa = listOf("123","211","3234")
    val bb = listOf(1,2,3)
    val cc = aa.zip(bb).toMap()
    println(cc)

    //fold函数
    val ee = listOf(1,2,3,4).fold(2){acc,num ->
        println(acc)
        acc + (num*3)
    }
    println(ee)

优点:

  • 累加变量隐式定义
  • 函数运算结果会自动赋值给累加变量,降低出错率
  • 执行新任务函数很容易添加到调用链上,都兼容Iterable类型

(53)惰性集合:序列(Sequence)

Sequences 序列接口强大在于其操作的实现方式。序列中的元素求值都是惰性的,所以可以更加高效使用序列来对数据集中的元素进行链式操作 (映射、过滤、变换等), 而不需要像普通集合那样,每进行一次数据操作,都必须要开辟新的内存来存储中间结果。

  • 中间操作:如果返回的是一个 Sequence 那么这就是一个中间操作,操作被延迟,在末端操作被调用时,才会输出提示

  • 末端操作:执行原来中间操作的所有延迟计算

  • 创建序列:(1)list.asSequence()
    (2)val num = generateSequence(0){it+1}
    (3)val numOnce = num.constrainOnce()一次性序列

  • 数据量越大,性能越好

  • 优化原理:不会开辟空间保存中间值,只算出结果

  • 实例化对应的 Sequence 子类对象,每个子类对象重写了 Sequence 接口中的 iterator () 抽象方法,内部实现根据传入的迭代器对象中的数据元素,加以变换、过滤、合并等操作,返回一个新的迭代器对象。这就能解释为什么序列中工作原理是逐个元素执行不同的操作,而不是像普通集合所有元素先执行 A 操作,再所有元素执行 B 操作。

(54)协程:轻量级线程

  • 为什么不用线程? 回调地狱:callBack里嵌套callback,代码可读性差
  • 协程以后将会单独开一章讲解
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

kotlin语法总结(二) 的相关文章

  • Android volley使用RequestFuture.get()时出现超时异常

    在我的片段中 我尝试使用 TMDB 的开放电影数据库来获取有关 正在播放 电影的详细信息 如果我使用 RequestFuture get time TimeUnit 方法来执行此齐射请求 我总是会收到超时错误 如果我在 Safari 中手动
  • Java - JPanel 内有边距和 JTextArea

    我想创建这样的东西 主面板有其边距 x 并且 TextArea 位于该面板的中心 几乎填满了面板 底部是另一个具有自定义尺寸 高度 y 的面板 可以使用某些快捷方式将其切换为可见和不可见 底部面板有 FlowLayout 和几个元素 问题是
  • LocalDate 减去 period 得到错误的结果

    LocalDate减去一个Period 如 28年1个月27天 得到错误的结果 但减去一个Period 只有天单位 如 10282 天 得到正确的结果 有什么需要注意的吗 public static void main String arg
  • Java 中的 ExecuteUpdate sql 语句不起作用

    我正在学习如何将 SQL 与 Java 结合使用 我已成功安装 JDBC 驱动程序 并且能够从数据库读取记录并将其打印在屏幕上 我的问题发生在尝试执行更新或插入语句时 没有任何反应 这是我的代码 问题所在的方法 public static
  • 将现有 eclipse 项目导出到 war 文件时出现“模块名称无效”

    我正在尝试将现有 Eclipse 项目导出到 war 文件 但无论我在 WAR Export 对话框页面中输入什么 系统总是返回 模块名称无效 我不知道如何解决这个问题 谢谢您的帮助 我有同样的问题 我修复了它 请按照以下步骤操作 您可以创
  • 从 HttpClient 3 转换为 4

    我已经成功地对所有内容进行了更改 但以下内容除外 HttpClient client HttpPost method client new DefaultHttpClient method new HttpPost url InputStr
  • Flutter - 删除 ListView 中项目之间的空间

    我正在使用 ListView builder 函数来创建项目列表 然而 iOS 中每个项目之间的空间很大 截图 你知道如何删除项目吗 看来是默认的 因为我没有添加它 code 列表显示 return Scaffold body ListVi
  • 是否有最新的 Facebook Java SDK? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 好像没找到最近更新的 如果没有 是否有一个好的 Java 库来执行与 Facebook 的 API 交
  • 从 Android 访问云存储

    我一直无法找到任何有关如何从 Android 应用程序使用云存储的具体文档 我确实遇到过这个客户端库 https cloud google com storage docs reference libraries然而 Google Clou
  • phonegap html5 android 同步文件系统 IO

    如何使用 PhoneGaps 文件系统 API 同步读写文件 有可用的同步包装器吗 无法通过提供的 api 同步访问文件 从phonegap的实现方式猜测 我怀疑您是否可以编写一个插件来同步执行此操作
  • 多线程——更快的方法?

    我有一堂有吸气剂的课程getInt 和一个二传手setInt 在某个领域 比如说领域 Integer Int 一个类的一个对象 比如说SomeClass The setInt 这里是同步的 getInt isn t 我正在更新的值Int来自
  • Android 10 请求 ACTIVITY_RECOGNITION 权限

    我试图遵守 Google 的要求 为 Android 10 请求 ACTIVITY RECOGNITION 权限 但我似乎不明白为什么没有显示权限弹出窗口 就像其他权限 即位置 存储等 一样 我的代码是 if ContextCompat c
  • Java8:流映射同一流中的两个属性

    我有课Model带有以下签名 class Model private String stringA private String stringB public Model String stringA String stringB this
  • 按“重置应用程序首选项”后,我的应用程序的所有权限都被撤销

    我开发了一个应用程序 支持Android 6 0 当我在 设置 gt 应用程序 gt 重置应用程序首选项 中重置应用程序首选项时 我的应用程序的所有权限都将被撤销 并且应用程序不会重新启动 撤销权限后未能重新启动应用程序可能会导致许多意外崩
  • 如何解决android程序中的警告“从不本地读取”

    为什么我收到警告说 The field testscreen ScaleAnimToShow mVanishAfter is never read locally testscreen java testscreen src com tes
  • CXF:通过 SOAP 发送对象时如何排除某些属性?

    我使用 Apache CXF 2 4 2 当我将数据库中的某个对象返回给用户时 我想排除一些属性 例如密码 我怎样才能做到这一点无需创建临时的班级 有这方面的注释吗 根据 tomasz nurkiewicz 评论我应该使用 XmlTrans
  • Java 中的微分方程

    我正在尝试用java创建一个简单的SIR流行病模型模拟程序 基本上 SIR 由三个微分方程组定义 S t l t S t I t l t S t g t I t R t g t I t S 易感人群 I 感染人群 R 康复人群 l t c
  • 如何减少 Android 中浮动 editText 提示和 editText 框之间的空间?

    我有一个带有浮动提示的 EditText 但我想知道如何减少浮动提示和 EditText 框之间的空间 现在我的用户界面看起来像https i stack imgur com ltfra jpg https i stack imgur co
  • 如何使用注释处理 Hibernate 和 Spring 中的连接查询?

    我正在使用 Spring 和 Hibernate 以及 MySQL 开发应用程序 我是 Hibernate 新手 完成了基本任务 现在我需要在选择查询中应用联接以使用注释从多个表中获取数据 我已经搜索过但仍然没有任何想法 这是我的数据库表和
  • Android 版本低于 Lollipop 时出现 java.lang.NoClassDefFoundError

    我有一台运行 Android 21 的 Nexus 5 设备 我正在测试我的项目 没有任何问题 但是 如果我使用 Google API 19 在模拟器上进行测试 则会显示错误java lang NoClassDefFoundError 如果

随机推荐

  • 数组的方法以及特征

    数组变成一个字符串 1 join 可以在每一个元素中加一个字符串 2 toString pop 删除数组最后一个元素 push 增加数组 reverse 反转 slice 从下标开始取 sort 对数组进行排序 splice 删除数组的某几
  • 取消全部呼叫转移代码_中国移动的卡取消呼叫转移的快捷方式是什么?

    展开全部 取消已设置的所有呼转可用手机拨打 002 取62616964757a686964616fe59b9ee7ad9431333365663562消关机或无信号时转移可用手机拨打 62 取消无人接听时转移可用手机拨打 61 取消遇忙音占
  • 即时通讯(IM)开源项目OpenIM对WebAssembly支持,提升web端体验

    WebAssembly 是什么 2019 年 12 月 W3C 标准批准了第四种官方语言 WebAssembly Wasm 这种语言在结构 使用和功能方面与以前的语言有很大不同 WebAssembly 是一种新的编码方式 可以在现代的Web
  • [1138]java中json的使用和解析

    文章目录 1 创建json对象 1 1 创建JSONObject对象 1 2 创建JSONArray对象 2 解析json 2 1 官方json包解析 2 2 fastjson解析 2 3 jackson解析 1 创建json对象 1 1
  • 关于时区的时间的详解,比如UTC\GMT等

    来源 UTC 和 GMT 及 北京时间的关系 UTC和GMT 这两者几乎是同一概念 它们都是指的格林尼治标准时间 只不过UTC的称呼更为正式一点 两者的区别在于前者是一个天文 上的概念 而 后者是基于一个原子钟 在UTC中 每一年或两年会有
  • 移植micropython最小工程到mm32f3270微控制器

    移植micropython最小工程到mm32f3270微控制器 苏勇 2021 08 文章目录 移植micropython最小工程到mm32f3270微控制器 Introduction 初试micropython v1 6 增加MM32的移
  • OpenCV图像梯度(Sobel和Scharr)

    OpenCV图像梯度 Sobel和Scharr 1 图像梯度是什么 2 图像梯度的用途 3 图像梯度的使用 参考 这篇博客将介绍图像渐变以及如何使用OpenCV的cv2 Sobel计算Sobel渐变和Scharr渐变 1 图像梯度是什么 图
  • CMake - 使用 target_sources() 提高源文件处理能力

    翻译自https crascit com 2016 01 31 enhanced source file handling with target sources 使用 target sources 提高源文件处理能力 在CMake项目中
  • JDK8源码阅读(三) java.io.Serializable

    一 类 1 1 类修饰符 A 是一个接口 B 类的可序列化性由实现java io serializable接口的类启用 不实现此接口的类将不具有序列化或反序列化的任何状态 可序列化类的所有子类型本身都是可序列化的 序列化接口没有方法或字段
  • 数据结构——单链表OJ题

    单链表OJ题 前言 一 删除链表中等于给定值 val 的所有节点 二 反转一个单链表 三 返回链表的中间结点 四 输出该链表中倒数第k个结点 五 将两个有序链表合并 六 链表的回文结构 七 将链表分割成两部分 八 找出第一个公共结点 九 判
  • Matlab:交叉验证,索引结果重现,打乱数据

    总会有奇奇怪怪的想法和需求 想要产生的交叉验证的索引可以重现 虽然可以采取保存的方式 目录 一 随机选取 1 产生索引 2 调用数据 打乱数据 二 顺序选择 循环选取 1 数据初始化 样本个数 训练样本个数等 2 产生训练数据的索引 3 存
  • 多线程编程warning: cast to pointer from integer of different size [-Wint-to-pointer-cast] 错误解决

    在多线程编程中使用 thread start pthread t thread id THREAD BODY thread workbody void thread arg 创建子线程时因为最后一个参数需要是指向子线程的文件描述符 int类
  • 使用axis2 java2wsdl命令生成wsdl文件

    1 eclipse新建web工程 编写service接口方法 2 axis2环境变量配置 必须配置环境变量 否则执行java2wsdl命令时无法识别路径 如下 新建环境变量 AXIS2 HOME 值为axis2解压路径如 I path ja
  • vim常用配置及ideavim插件静音

    更多详细内容见文章 http www shanxing top p 188http www shanxing top p 188 提示音静音 set noerrorbells set visualbell 语法高亮 syntax enabl
  • Linux USB U盘热插拔挂载和卸载

    一 硬件平台 1 控制器 MT7620 A9内核 2 RTC芯片 MCP7940 二 软件平台 1 开发环境 Ubuntu12 04 2 SDK内核包 MT7620 SDK软件开发包 MediaTek ApSoC SDK 4320 2015
  • Ubuntu 18.04 VScode 使用php-debug插件

    1 安装xdebug 安装 php dev apt get install php7 X dev autoconf automake 复制代码 上面的7 X请改成对应的php版本号 不然默认会下载php最新的版本 使用对应的 xdebug
  • python运算符

    算术运算符 以下假设变量 a 10 b 20 加 两个对象相加 a b 输出结果 30 减 得到负数或是一个数减去另一个数 a b 输出结果 10 乘 两个数相乘或是返回一个被重复若干次的字符串 a b 输出结果 200 除 x除以y b
  • python matplotlib数据可视化案例-生成柱状图,饼图(扇形图),词云。

    目前python spark scala十分火爆 于是我就利用爬虫将猎聘上的招聘信息进行了一下获取 相比起来 猎聘上的职位数量还是很多的 3中技术类型以 python spark scala 作为关键词 一共爬取了一万多条信息 爬取的主要信
  • 【告别普通打包】webpack打包结果优化特性:Tree Sharking 和 sideEffects

    文章目录 1 Tree Shaking 摇树 1 1 摇树讲解 1 2 开启 Tree Shaking 1 3 合并模块 扩展 1 4 探讨 babel loader 的问题 2 sideEffects 2 1 sideEffects讲解
  • kotlin语法总结(二)

    上一章地址 kotlin语法总结 一 文章目录 前言 前言 这章接着上一章语法总结继续讲解 主要讲kotlin和java不一样的地方 40 嵌套类 41 数据类 data class 提供toString equals hashCode个性