零蚀


前言

  • 前言

    • 我对于kotlin这个语言的认识,应该是在它在google大会上被列为Android正式的开发语言之前,这也是我第一个买教学视频学习的知识,当时对他的热衷不亚于小孩对动画片的痴迷,我应该也算得上是国内第一批吃“螃蟹”的 kt 死忠粉(但只是那一会儿)。

    • 我记得当时我还没毕业,我当时找工作的目标,就是公司项目是kt编程的,不然就不想去,那时kt开发的还是相当的少,而现在国内kt已经非常普及了,但是,但是我现在却不在如以前那般,为什么呢,因为人都是会长大的,人都在随波逐流中看清身边的每一件事。

    • 首先说kt能节省代码,kt是可以节省代码它将很多代码优化过,但是这个东西真的好吗?暂且不说好坏,但是我觉得没有意义,一个有意义的东西必然是能节省能耗,或者某些功能更加突出,所以这个并没有意义,java也可以做,但只是自己知道罢了,也就是说这是给小白更好的上手的语言?或是说在和甲骨文打官司的不被套牢的备胎?(我觉得真正节省代码的还是python,在py面前kt都不能说自己节省了代码好吧,如果Android能用py作为第一语言,我肯定双手赞同)

    • 还有吹嘘协程的,其实我觉得kt的协程是一大败笔,它不配叫“协程”。为什么说协程是败笔呢,因为,在 py 和 go 语言中的 协程 它是真的可以做到节约性能,因为它节约了核心态和用户态的切换,但是kt的协程知识线程的切换,只是为了切换线程的好用,或许kt的“协程” 翻译是 “便携(协)式线程”,可以叫“携程”。

    • 再然后吹嘘kt诸多特性,其实这些特性py大部分都有的,所以也没什么好尬吹的,当然我知道的尚浅,可能有很多没有涵盖,但是我觉得一个语言主打的内容只是好用,真是emmm……,估计后端开发没有普及kt也是有道理的。

    • 我为什么现在要学kt(复习),只有一个原因,工作需要,不然我最多忘记了在网上查查知识点,与kt相比,java基础,算法基础,或者学习C or Py 都可以排在kt前面。所以这里 我简单回顾一下,查漏补缺,刚好最近电脑内存不足,其他学习内容无法展开,所以开始了kt的简单学习。

  • 计划

    • 第一次说了这么多的前言,真不好意思,说了这么多垃圾话,所以“下次一定”不说了,嘿嘿,然后我说一下,关于复习kt的计划,这部分的笔记为期4天,主要的学习内容是依附于Kotlin in Action。

    • 对于kt 和 flutter 而言,我觉得其实RN也挺好,Android 真是个渣“语言”,hetui……,怒其不争。(以上都是垃圾话)


Kotlin 基础

  • 基础

    • 首先修饰常量和变量的细致可分为const val ,val ,var。前两个是常量,后一个是变量,那么为什么常量会有const之分呢,这是因为const在代码转字节码的时候就已经定义了某个常量值,固定不变,这样节省了性能。

    • 这里可以用${变量}在字符串中穿插一个变量,如果只是输出一个变量,我们还可以使用$变量

    • 可变类型如下其实就是一个数组参数。

    fun main() {action(11,22)
    }fun action(vararg arg:Int){print("${arg[0]}")return
    }
    
    • 循环可分为一下几种类型,对应着java的for循环。
    // [0,10] 闭区间
    for(i in 0..10){print(i)
    }
    // [0,10)左闭右开
    for(i in 0 until 10){print(i)
    }
    // [10,0]
    for(i in 10 downTo 0){print(i)
    }
    // step设置间隔跨度,[0,2,4,6,8,10]
    for (i in 0..10 step 2){print(i)
    }
    
    • 异常捕获,为什么要提这个呢,主要是在java8后java语言不仅添加了一些类python 中的 lambda的新特性,它也吸收了python的另一个编辑小亮点,但是kt没有这么做,(虽然我觉得这并没有意义)如下所示:
    // java
    try(InputStream stream =new FileInputStream(file)){//这里可以使用stream。
    }catch (Exception e){}
    // kotlin
    try {InputStream stream =new FileInputStream(file)
    }catch (e:Exception){}
    
    • 在java中常用还有一个很常用的Bean用来接收数据,而kotlin中使用的是data class
    fun main() {val b= Bean("1","2")println(b.a)b.a=""println(b.toString())
    }data class Bean(var a:String,val b:String)
    
    • 在kotlin中有一个顶层申明,这么做的目的是什么呢,是为了消除工具类的创建,减少类的创建,其实这种方式创建的函数和属性,其实是一种静态模式,这鞋属性方法,统一在Root下,所以我们在哪都可以调用到他们。

    • 为了避免顶层的命名冲突,kotlin在命名的时候支持使用import的方式来防治同名情况,当然他也支持py那种别名方式 import …… as ……的方式。

    • 因为顶层申明和static类似,所以如果是在temp.kt中调用方法,那就会是tempKt.function()。

  • 类和函数

    • 首先值得一提的是扩展函数,什么是扩展函数,就是针对类或者接口进行一些扩展功能的函数,那什么是扩展功能,这里可以理解为扁平化,可以参照Rx。
    fun main() {// 类的扩展函数print("ok".multiply(3)) //ok;ok;ok;println("")print("ok"*3) //ok;ok;ok;}fun String.multiply(num : Int):String{// 这里的this表示这个类var temp=""for (i in 0 until num){temp+= "$this;"}return temp
    }operator fun String.times(num : Int):String{// 对运算符的扩展,需要添加operator进行拓展标识var temp=""for (i in 0 until num){temp+= "$this;"}return temp
    }
    • 扩展属性,首先和函数一样,扩展的对象是类,然后它操作的目标是属性。比如我想用一个字符床的.first表示这个字符串第一个元素。
    var String.first:Charget()=get(0)set(value) {print("$this:$value")}fun main() {print("kotlin".first) // k"哈".first='p' // 哈:p}// 如果java想调用的话,需要使用get/set函数方式来调用
    OneKt.getFirst("xxxx")
    
    • 类的委托,这种关系,类似于A类他没有实现C这个接口,但是他想调用,所以我委托B来帮我实现,然后A就可以调用B实现的借口方法(就像你女朋友想买房,但是自己买不起or不想买,她于是委托你来帮她实现,然后她直接获取居住方法一样!这里A通过by将意向委托给了B)
    fun main() {A(B()).a()}class A(b:C) :C by b{//....}open class B : C{override fun a() {print("我做了很多很多事")}}interface C{fun a();}
    
    • object 一般有两种用法,一个是修饰一个类,让这个类形成一个单例(其实静态的属性,还可以使用伴生对象生成companion object{},其实这里没必要写的书上解释的那么复杂,伴生对象就是相当于在类中定义了static这么简单),第二种是object可以实现一个接口,下面模仿Android中点击时间做一个案例。
    fun main() {setOnClickListener(object :ViewClickListener{override fun onClick() {// 这里实现了这个接口}})}fun setOnClickListener(listener:ViewClickListener){}interface ViewClickListener{fun onClick();}
    
  • Lambda

    • 我们清楚什么是lambda表达式,他怎么用,在java其实他就是匿名内部类的简化写法,kotlin也可以简化内部类,就想上面object实现方式是不是看着怎么这么复杂,感官不好,这里我们用到的就是直接大括号形式了。emmm,其实这里看着好像更麻烦了。
    fun main() {// lambda模式接收点击事件setOnClickListener{print("点击了1")}// 模拟点击里l.onClick()
    }lateinit var l: ViewClickListener
    fun setOnClickListener(listener: () -> Unit) {l=object : ViewClickListener{override fun onClick() {listener()}}
    }interface ViewClickListener {fun onClick();
    }
    
    • 当我们需要将类的函数赋值给一个变量时候我们可以使用如下操作,但是我们还可以通过类的引用方式,将类的成员引用赋值给一个对象。以下两种写法一致。
    val p1={a:A->a.action()}
    p1(A())
    val p2=A::action
    p2(A())
    
    • kotlin除了在上面这么使用,也可以用于简化函数,比如我们构造一个简单的函数,就是传两个参数,然后返回他们的和,如果你用过python,你一定会偏向于用lambda解决一切。
    val a = { x: Int, y: Int -> x + y }
    print(a(1,2))
    
  • 集合

    • kotlin中常用到的集合
     val array = arrayOf(1,2,3,5)val list = listOf(1,2,3,5,6)val map = mapOf("one" to 1,"two" to 2)print(map["one"])
    
    • fliter 和map,这里的fliter和它的名字一样,是用来过滤的方法,比如说,我要过滤出list所有可以被2整除的元素,或者是过滤出满足条件的对象;map 是将每个元素进行map函数的处理,从而得出一个新集合。
    // filter过滤
    val list= listOf(1,2,3,4,5,6)
    val newList=list.filter { i -> i%2==0 }
    // map
    val list = listOf(1, 2, 3, 4, 5, 6)
    val newList = list.map { i -> "${(i * i)}"}
    
    • 除了上述的用法,我们还可以使用集合有关的函数,all用来判断集合所有的元素是否满足条件;any集合中是否有一个元素满足条件;count 集合中满足条件的数量;groupby 集合根据条件进行划分为特定的map;flatMap 将列表平铺;flatten 单纯的将一个list嵌套的list集合进行铺平,不需要做其他操作。
    // all 集合所有的元素是否满足条件
    val isAllMin:Boolean = list.all { i -> i<10 }
    // any 集合中是否有一个元素满足条件
    val isAnyMin:Boolean = list.any { i -> i<2 }
    // count 集合中满足条件的数量
    val num:Int = list.count { i -> i<2 }
    // find 返回第一个满足条件的元素,或者返回null
    val num:Int? = list.find { i -> i<2 }
    //group 根据第一个字符不同来进行分组。
    val list = listOf("a","b","ab","cb")
    val map:Map<Char,List<String>> = list.groupBy {i->i.first}
    print(map) //{a=[a, ab], b=[b], c=[cb]}
    // group 根据字符串是不是等于一来分组
    val map:Map<Boolean,List<String>> = list.groupBy {i-> i.length==1}
    // flatMap 将集合糅合成一个集合
    val list = listOf("a","b","ab","cb")
    val l = list.flatMap { it -> it.toList()}
    print(l)
    // 单纯的将一个list嵌套的list集合进行铺平,不需要做其他操作
    val list:List<List<String>> = listOf(listOf("a","b"),listOf("aa","bb"),listOf("ac","bv"))
    val l =list.flatten()
    print(l) //[a, b, aa, bb, ac, bv]
    
    • 在说了这么多的方法后,我们大多都是可以返回一个集合,但是如果我们此时我们有大量链式调用发生,就会产生多个临时对象,如果在高频的循环中,导致内存抖动也是有可能的,所以我们可以用懒惰集合,它会产生一个序列Iterable,然后后面的操作都是这个序列的操作,这样避免大量的临时对象生成。
    // 懒惰集合
    val newList=list.asSequence().filter { true }.map { it->it.first }.toList()
    
  • with & apply

    • with是一个在kotlin中比较有亮点的函数吧,它有两个参数,第一个参数是一个对象,第二个是一个lambda函数。它相当于将第一个参数传入lambda函数之后然后返回函数最后一行。它相当于
    val a= with("abcd",{this.map { "$it+" }
    })
    print(a) //[a+, b+, c+, d+]
    
    • apply 只是他返回的是参数对象,这些方法主要的不是返回值,而是通过这种方式来调用和操作内部的方法。它在函数范围内可以调用该对象的所有函数
    val a= "abcd".apply {this.map { "$this+" }
    }
    print(a) //abcd
    
    • let的用法是返回最后一行,用法和apply一致。

NO.1 Kotlin 第一天相关推荐

  1. kotlin 第一个程序_Kotlin程序添加两个矩阵

    kotlin 第一个程序 Given two matrices, we have to add them. 给定两个矩阵,我们必须将它们相加. Example: 例: Input: matrix 1: ...

  2. kotlin 第一个程序_Kotlin程序减去两个矩阵

    kotlin 第一个程序 Given two matrices, we have to subtract them. 给定两个矩阵,我们必须将它们相减. Example: 例: Input: matr ...

  3. Kotlin 第一弹:自定义 ViewGroup 实现流式标签控件

    古人学问无遗力, 少壮工夫老始成.纸上得来终觉浅, 绝知此事要躬行. – 陆游 <冬夜读书示子聿> 上周 Google I/O 大会的召开,宣布了 Kotlin 语言正式成为了官方开发语言 ...

  4. Kotlin第一课Hello World —— Package、main、fun、import、变量、注释

    我们还是用Hello World的例子展开,代码如下: package com.my.examplefun main() {println("Hello World") } pac ...

  5. Kotlin第一弹:Kotlin详细介绍

    会一直坚持写关于Kotlin的入门系列文章,赶紧关注一起学习吧! 目录 前言 Kotlin是什么? 一.为什么优先使用Kotlin进行Android开发? 二.Kotlin优先意味着什么? 三.Kot ...

  6. Kotlin 概述【官方】

    多平台编程 支持多平台编程是 Kotlin 的主要优势之一.它减少了为不同平台编写和维护相同代码所花费的时间,同时保留了本机编程的灵活性和优势. 这就是 Kotlin Multiplatform 的工 ...

  7. android观察者模式例子,Android-Kotlin实现观察者模式的小案例

    在日常的Android开发当中,我们肯定会遇到要使用观察者模式的场景.下面分享一下利用如何用Kotlin实现Android的交互代码. 源码 1.创建两个接口 /** * 类说明:观察者接口 * * ...

  8. 近 10 年新秀编程语言大 PK,Pick 它!

    作者 | Andrew Smith 译者 | 明明如月,责编 | 伍杏玲 头图 | 东方 IC 出品 | CSDN(ID:CSDNnews) 编程语言演进的步伐不会停止.尽管 Python.C.Jav ...

  9. 过早优化是万恶之源_专业化是万恶之源

    过早优化是万恶之源 Has something like this ever happened to you? 发生过类似的事情吗? You go on a website, and there's ...

最新文章

  1. LeetCode: 20. Valid Parentheses
  2. 研效优化实践:Python单测——从入门到起飞
  3. ssis 循环导入数据_使用集成服务(SSIS)包从Amazon S3 SSIS存储桶导入数据
  4. mysql优化 my.cnf_MySQL性能调优my.cnf详解
  5. iview在项目中遇到的坑
  6. 走进缓存的世界(二) - 缓存设计
  7. 又一个5.1要过去了...
  8. android省市区三级联动,NumberPicker实现省市区三级联动的效果
  9. uniapp 蓝牙连接条码枪/扫描枪 HID模式
  10. 全国计算机一级考试试题题库---附答案
  11. 天线发射功率计算公式_天线增益的定义/计算公式/发射功率
  12. 解二元一次方程组程序
  13. HDLBits—Exams/ece241 2014 q7a
  14. Android Studio 快捷用法
  15. Prisma(一)——基础
  16. [计算机组成原理]定点数运算及溢出检测
  17. 左联接、右联接、内联接、自然联接
  18. 解决mmdetection训练过程loss为nan的问题
  19. 2019阿里java面试题
  20. 骗子广告联盟_骗子把我的脸变成了Google广告

热门文章

  1. 多条件查询or和and组合查询
  2. Halcon--OCR识别
  3. Angular入门教程
  4. 14年中,13寸MacBook pro外接显卡坞(技嘉aorus gaming box)经验
  5. taobao.rp.refund.review( 审核退款单 )
  6. PAT 乙级 1007(C++)
  7. XDC文件注释必须要另起一行
  8. 实验九 单周期MIPS CPU设计实验(基于Logisim)
  9. vue爬坑 div中使用v-html,里面的图片溢出问题;
  10. 默认配色辣眼睛?!那是你没发现这些宝藏学术颜色包(Colormaps)~~