复习 Kotlin 从小白到大牛 第二版 笔记要点

news2024/11/15 9:26:59

4.2.2 常量和只读变量

常量和只读变量一旦初始化就不能再被修改。在kotlin中,声明常量是在标识符的前面加上val或const val 关键字。

1. val 声明的是运行时变量,在运行时进行初始化

2.const val 声明的是编译时常量,在编译时初始化

val 相当于 final

const val 相当于 public static final

5.4.1 可空类型概念

例子:

var n:Int = 10   n=null   编译错误

var n:Int?=10 n=null  可以

Kotlin 安全运算符

1.安全调用运算符?.

2.安全转换运算符 as?.

3.Elvis 运算符?:

  也叫 空值合并运算符  例子:

var a=divide(100,0)

int x=a?:0  

结果x=0

意思就是 假如a是空值,则让x=0  相当于给他一个默认值,空的就赋值0,避免了null 报错

4.非空断言 !!

6.2.5字符串比较

val s1="Hello"

val s2="HELLO"

s1.equals(s2,ignoreCase = true)//忽略大小写比较内容是否相等  结果为true

除了equals 之外,还有compareTo ,这个比较的是顺序,返回的是数字,

如果俩个字符串相等结果为0,前面的小就返回负数,大就返回正数

7.5其他运算符

冒号: 用于变量或者常量类型声明,以及声明继承父类和实现接口

小括号():起到改变表达式运算顺序的作用,他的优先级更高

中括号【】:索引访问运算符号

等号:赋值

可空符?标识一个可空类型

安全调用运算符?.   调用非空类型的函数或者属性

Elvis ?:     空值合并运算符

非空断言 !! 就是一定不会是空值

双冒号::  引用类,属性或函数

区间.. :表示一个范围区间

箭头-> 用来声明lambda 表达式

展开运算符*将数组传递给可变参数时使用

8.1分支结构

if else

when(){

x->{

}

}

do{

}while()

8.2.3 for语句

for( a int 0..9){

}

for(a int 0..list.size){}

for(item in list){}

//获取数组索引

for(i in list.indices){}

8.4 使用区间

for(x in 0..5) //定义区间包含0和5

for(x int 0 until 5) //定义半开区间包含0,不包含5

8.4.2 使用in 和!in 关键字

例子

var testScore=80   //设置一个测试分数
        var grade=when(testScore){
            in 90..100->"优秀"
            in 80 until 90->"良"
            in 60 until 80->"中"
            in 0 until 60->"差"
            else->"无"
        }

        if(testScore !in 60..100){
            println("不及格")
        }

        val strList= arrayOf("刘备","关羽","关羽")
        var name="赵云"
        if(name !in strList){
            println(name+"没结义")
        }

函数

fun 函数名(参数列表) : 返回值类型{

        函数体

        return 返回值

}

9.3.1使用命名参数调用函数

xxx(100,100)//没有采用

xxx(width=100,height=100)//采用命名函数

xxx(100,height=100)//采用

这个操作,之前的java使用参数提示的,命名函数可能有其他操作吧

9.3.2参数默认值

 9.3.3可变参数

 这里可以和扩展运算符*结合

9.5 局部函数

9.6匿名函数

 fun nimingTEST(a:Int,b:Int):String{
        val xxx=if(a==b)
            fun (x1 : Int, x2:Int):String{return (x1+x2).toString() }
        else
            fun (x1 : Int, x2:Int):String{return (x1-x2).toString() }
        return  xxx(a,b)
    }

感觉这个不如一条一条列出来清晰

10.4.1 Bean

 

 10.4.3延迟初始化属性

lateinit 字面意思延迟初始化,用的时候才会实例化,实例化是占内存,这个可以避免内存消耗吧

lateinit 关键字放在var之前,不能是可空类型

10.4.6可观察属性

 这里做了一个点击查看的操作,是可以监听到的,

10.5.1扩展函数


    //基本数据类型扩展
    fun Double.interestBy(interestRate: Double): Double {
        return this * interestRate
    }

    //自定义账户类
    class Account {
        var amount: Double = 0.0 //账户金额
        var owner: String = ""  //账户名
    }

    //账户类函数扩展
    fun Account.interestBy(interestRate: Double): Double {
        return this.amount * interestRate
    }

 Double 类型可以引用

 看起来很方便

这个看起来只能在当前类中使用

肯定可以写全局的

写一个文件,注意是文件不是类

 这样直接在其他地方可以用了,需要注意是在同一个包里

10.6构造函数

 默认是自带无参数构造


10.8.1声明数据类

创建一个类,区分了是数据类还是工具类还是其他类

数据类关键词data

添加一个data关键字后变成了数据类,底层数据类

底层的三个方法

hash()  toString equals 另外增加了一个copy的方法

data 修饰的类 参数有要求,必须要有var/val修饰

 

打印出来是2,也就是 修改了其中一个值其他都是之前的

10.10嵌套类

 无法访问外部类成员变量

加一个内部类关键字就可以了

 10.11.1对象表达式

Object关键字

接口回调

 

10.11.3 伴生对象

Kotlin 没有 java中的Static 所以

伴生类不能访问外部类的成员属性啥的,这个交互起来,还是以外部类为主

11.继承与多态

关键字open,Kotlin 默认是 final修饰的类和属性只有加上open才能被继承

 都一样,哪个代码少用哪个

11.4.1 is as

is 相当于 instanceof    as 相当于强类型转换

13.2.4 函数作为参数调用

费劲巴拉的你直接宽*高不就得了。

13.3Lambda 表达式


使用案例2

 简便了为啥我感觉花里胡哨的没有java通俗易懂


 简化之后Int直接省略了

省略写法

 没啥意思啊~


13.3.4 return

 return@foreach可以跳出本次循环,return 和 break 会跳出整个循环

 这种写法就可以用continue


13.4.闭包与捕获变量

这个有点绕

 


13.5内联函数

关键字inline

13.5.2Let函数

let的特点 1  最后一行是赋值

let特点2非空检查

在koltin中防止引用null对象,所有的对象都可以调用let方法,为空时不执行,不为空时执行

 a是自己取的名字,可以使用默认的it

let特点3 直接读取调用链结果

例子

这里拿到的是他们的长度,但是我想要字符串本身

 直接拿到数据

map是转换的意思

run

with

和run类似,但是他没有返回值

 apply

        

also


 泛型

假设要做一个比较的方法

这里只能比较int 参数

在方法名之前加上<T>就行了,一般都是TEKU

如果是多类型的<T,U>,中间用逗号隔开

14.1.3泛型约束

假如只想比较数字方向的类型,可以大概给个Number,他的子类有Int Double

 也可以写成

Comparable<T>包括了很多可以比较的类型,前后的参数一定要一个类型的

14.1.4可空类型参数

假如参数是空的,我们需要防止

可空

 不可空

3大基础函数

filter

过滤

map

转换

reduce

聚合

 聚合函数

阶乘

     // n个元素
        val intArray = IntArray(2) {
            it + 1
        }
        val reduce = intArray.reduce { acc, i ->
            acc * i
        }
        println(reduce)

从1开始到n的阶乘


 结果是从0到999


19协程

在执行阻塞任务时.会将这种任务放到子线程中,执行完成再回调(callback)主线程,更新UI等操作,这就是异步编程。协程底层库也是异步处理阻塞任务,但是这些复杂的操作被底层库封装起来。协程代码的程序流是顺序的,不再需要一堆的回调函数,就像同步代码一样,也便于理解,调试和开发

线程是抢占式的,线程调度是操作系统级的,而协程是协作式的,协程调度是用户级的,协程是用户空间线程,与操作系统无关,所以需要用户自己去做调度

19.2创建协程


 launch 函数的返回值是一个Job对象,Job是协程要执行的任务,可以将Job对象看做协程本身,所有对协程的操作都是通过Job对象完成的,协程的状态和生命周期都是通过Job反应出来的

Job对象的常用属性和函数

isActive 判断Job是否处于活动状态

isCompleted判断Job是否处于完成状态

isCanceled判断Job是否处于取消状态

start 开始Job

cancel取消Job

join 当前协程处于等待状态,知道Job完成,join是一个挂起函数,只能在协程体中或其他的挂起函数中调用

launch 和 runBlock 是相反的,runBlock 会阻塞线程

 从这里可以看出通过.launch开启一个协程会被先挂起,同级别的代码会先运行,


 

 

suspend是一个协程的关键字,被他修饰的函数就会挂起,例如这个delay(),他只能在协程方法体内运行,当遇到了suspend函数的时候,当前的协程就会主动逃离当前的线程去别的地方执行任务,当函数比如delay 500  执行完了,他就会回来线程继续执行

suspend就是让协程该走就走,执行完在回来,给主线程或者说同级别的代码块更好的运行

这里的运行顺序换成runBlock

 和上面相反程序会等runblock 执行完再执行下面

由于这种操作有可能阻塞主线程,所以很少有


简单实用的场景

butStart.setOnClickListener(View.OnClickListener {
            val coroutineScope = CoroutineScope(Dispatchers.Main)
            coroutineScope.launch {
                withContext(Dispatchers.IO) {
                    Thread.sleep(5000)
                    a = 20
                }
                text.text = ""+a
            }
        })
可以通过withContext 把它切换到子线程,

 以后用它替换java的AsycnTask吧,至于其他方法太烦了


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/391649.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【springmvc】10.拦截器

拦截器 1、拦截器的配置 SpringMVC中的拦截器用于拦截控制器方法的执行 SpringMVC中的拦截器需要实现HandlerInterceptor Component public class FirstInterceptor implements HandlerInterceptor { Override public boolean preHandle(HttpServletRequest request, …

mysql5.7.33安装配置教程【保姆级安装教程】

MySQL5.7.33安装教程 1、官方网站下载 点击这里跳转页面下载 1.1、看下你是什么系统&#xff0c;系统是64位还是32位 2、解压到D盘跟路径或者其下面纯英文路径 2.1、可见它没有data、log等文件夹&#xff0c;不需手动添加(下面执行命令自动初始化)&#xff01;&#xff01; …

如何安装python

windows安装 下载安装包 登录python官网 https://www.python.org/ 点击downloads 置顶下载的是最新的python版本 如果想下载指定版本往下翻找 安装程序 点击即可下载&#xff0c;然后打开下载的exe程序 勾选添加pythonexec到path&#xff0c;也就是添加到环境变量 使用a…

Vue2.0开发之——购物车案例-Footer组件封装-计算商品的总价格(51)

一 概述 App.vue中计算勾选商品的总价格定义子组件Footer中的商品总价格将App.vue中商品的总价格传递给Footer显示 二 App.vue中计算勾选商品的总价格 2.1 商品总价格的计算逻辑 所有勾选商品的价格*数量 2.2 App.vue中通过计算属性计算总价格 通过计算属性计算总价格 co…

esp8266WiFi模块通过MQTT连接华为云

esp8266WiFi模块通过MQTT连接华为云总结&#xff1a;一、 MQTT透传AT固件烧录二、 串口调试2.1 设置模块为STA模式2.2 连接WiFi2.3 设置MQTT的登陆用户名与密码2.4 设置MQTT的ClientID2.5 设置MQTT接入地址2.6 订阅设备属性上报的主题2.7 上传数据2.8 平台下发命令2.9 华为云物…

网络编程学习笔记(1)--TCP/IP协议基础

目录 全称 定义 分层结构 端到端的数据传输 ​编辑 举个栗子——浏览网页 应用层 传输层 TCP UDP 网络层 IP协议 特点 IP地址 网络掩码 ARP协议 PARP协议 ICMP协议 数据链路层 名词解释 数据段 数据报 数据包 数据帧 比特流 全称 Transmission Contro…

关于进制的转换

将n进制转化为m进制一般&#xff0c;我们是通过位值定理来将n进制转化为10进制&#xff1b;然后对整数进行辗转相除来得到m进制整数void find(int x){//integer; w0;while(sum>0){ //先除为低&#xff1b; t[w]q[sum%m];w;sum/m;}markw; }for(int ik-1,j0;i>0;i--,j){//i…

Linux操作系统学习(线程基础)

文章目录线程的基础概念线程控制内核LWP和线程ID的关系线程的基础概念 ​ 一般教材对线程描述是&#xff1a;是在进程内部运行的一个分支&#xff08;执行流&#xff09;&#xff0c;属于进程的一部分&#xff0c;粒度要比进程更加细和轻量化 ​ 一个进程中是可能存在多个线程…

【Java|golang】1653. 使字符串平衡的最少删除次数---动态规划

给你一个字符串 s &#xff0c;它仅包含字符 ‘a’ 和 b’​​​​ 。 你可以删除 s 中任意数目的字符&#xff0c;使得 s 平衡 。当不存在下标对 (i,j) 满足 i < j &#xff0c;且 s[i] ‘b’ 的同时 s[j] ‘a’ &#xff0c;此时认为 s 是 平衡 的。 请你返回使 s 平衡…

亚马逊、速卖通、lazada店铺一直不出单,没流量怎么办?

近几年&#xff0c;跨境电商入驻的卖家越来越多&#xff0c;平台的流量越来越分散&#xff0c;导致店铺没有流量没有订单的情况经常发生&#xff0c;因此卖家对店铺的优化尤为主要。 对于亚马逊卖家来说&#xff0c;几乎每天都会问虽然我把我的产品放在货架上&#xff0c;但没…

4N60-ASEMI高压MOS管4N60

编辑-Z 4N60在TO-220封装里的静态漏极源导通电阻&#xff08;RDS(ON)&#xff09;为2.5Ω&#xff0c;是一款N沟道高压MOS管。4N60的最大脉冲正向电流ISM为16A&#xff0c;零栅极电压漏极电流(IDSS)为1uA&#xff0c;其工作时耐温度范围为-55~150摄氏度。4N60功耗&#xff08;…

Vue基础17之配置代理

Vue基础17配置代理使用node启动两台服务器server1.jsserver2.js使用axios发送ajax请求安装axios库引入axios库发送axios请求App.vue跨域问题解决代理服务器开启&#xff1a;方式一代理服务器开启&#xff1a;方式二server1.jsserver2.jsvue.config.jsApp.vue总结&#xff1a;Vu…

面向对象设计模式:结构型模式之代理模式

一、引入 访问 FB&#xff1a;代理服务器 二、代理模式 aka Surrogate 2.1 Intent 意图 Provide a surrogate (代理) or placeholder for another object to control access to it. 为另一个对象提供一个代理或占位符&#xff0c;以控制对它的访问。代理模式给某一个对象提…

2023年如何在Google做外贸

2023年如何在Google做外贸 答案是&#xff1a;利用谷歌SEO获取自然流量促进成交。 随着全球化和数字化的发展&#xff0c;外贸行业越来越重视互联网的渠道拓展。 在Google搜索引擎上做好SEO优化&#xff0c;是吸引国际客户和提高品牌知名度的关键。 本文将探讨2023年如何在…

【容器运行时】一文理解 OCI、runc、containerd、docker、shim进程、cri、kubelet 之间的关系

参考 docker&#xff0c;containerd&#xff0c;runc&#xff0c;docker-shim 之间的关系Containerd shim 进程 PPID 之谜内核大神教你从 Linux 进程的角度看 DockerRunC 简介OCI和runCContainerd 简介从 docker 到 runCDockershim究竟是什么技术干货&#xff5c;Docker和 Con…

C# 中的abstract和virtual

重新理解了下关键字abstract,做出以下总结&#xff1a; 1.标记为abstract的类不能实例化&#xff0c;但是依然可以有构造函数&#xff0c;也可以重载构造函数&#xff0c;在子类中调用 2.abstract类中可以有abstract标记的方法和属性&#xff0c;也可以没有&#xff0c;被标记…

Linux网络编程学习(网络基础)

文章目录网络基础浅谈计算机网络背景了解协议网络传输基本流程局域网传输基本流程跨网络的数据传输流程网络基础 浅谈计算机网络背景 ​ 计算机最早是没有网络的&#xff0c;当时想要数据之间交互就需要人来传递&#xff0c;但是这样效率非常低&#xff0c;而且也容易出错&am…

机器人姿态规划的三种常见方法:欧拉角、角轴和四元数

参考文献&#xff1a; 1. 布鲁诺西西里安诺等[意] 《机器人学&#xff1a;建模、规划与控制》 2. 四元数小总结 - 孤独の巡礼 - 博客园 (cnblogs.com) 3. 基于单位四元数的姿态插补&#xff08;Matlab&#xff09; - 知乎 (zhihu.com) 4. 基于四元数的工业机器人姿态规划与插…

javaScript基础面试题 --- JS作用域

面试10家公司&#xff0c;得有8家会问到作用域的题。所以说JS的作用域一定要弄清楚&#xff0c;非常重要&#xff01; 1、除了函数之外&#xff0c;JS没有块级作用域 2、作用域链&#xff1a;内部可以访问外部的变量&#xff0c;但是外部不能访问内部变量&#xff0c;如果内部有…

Docker搭建jenkins(Vue自动化部署)

前言 需要提前准备的条件 Docker环境 一、jenkins镜像 # 查询镜像 docker search jenkins# 下载镜像 # lts稳定版 docker pull jenkins/jenkins:lts#查看镜像 docker images二、启动Jenkins容器 创建挂载文件夹&#xff0c;并且进行文件授予权限 #创建文件夹 mkdir -p /home/j…