快 三 大 神 带 回 血 是 真 的 还 是 假 的

数据分析师【????????????????】邀请【????????????????】网cp15115点c0m
kotlin变量的使用,kotlin的基本数据类型都是引用类型,和java的String一样都是对象

不可变变量,相当于java的final修饰,申明时候必须初始化

使用原型:val 变量名:类型 = 变量值
使用举例:

val valInt = 1
val valInt2:Int = 2
valInt不指定类型,会根据赋值自动推导。val定义的变量作为常量存在,其值不可改变。

可变变量、不为null,申明时候必须初始化

使用原型:var 变量名:类型 = 变量值
使用举例

var valLong: Long = 12222
valLong = 2
var申明的变量可以改变其值,但是未申明可以为null,赋值null会报错。

可变变量、可为null,通过问号标记

使用原型:var 变量名:类型? = 变量值
使用举例

var varNullString: String?
varNullString = null
varNullString = "sss"
空安全

当对象或者变量使用问好修饰后,编译器会强制强制要求进行空安全检查,尽可能避免运行时出现空指针异常。空检查时候,如果被检查对象为null,此行代码不会执行

//定义一个可空变量
var varNullString: String?
//第一种使用方式,建议使用这种
var len = test?.length
//类似java中
//if(test!=null){
// len=test.length
//}
//第二种使用方式
len = test!!.length //这种当test为null时会报异常
//类似java中
//if (test != null) {
// len = test.length
//} else {
// 抛出异常
//}
//第三种使用方式
len = test?.length ?: 10
//类似java中
//if(test!=null){
// len = test.length
//}else{
// len = 10;
//}
 
类与继承、接口
官方文档
类、接口、继承、实现接口和java非常类似

类与java区别:

1、kotlin的类中字段默认时public,对外可见,修改控制访问权限时可以设置为private、protect等。
2、kotlin的类中字段默认全部实现get、set方法,需要修改这两个方法时候可以重写
3、kotlin的类可以重写init方法,此方法在类实例化时候调用,可以做初始化操作

接口与java区别

1、kotlin的接口和java有点区别可以定义包含方法体的方法,java的接口只能定义抽象方法。
2、kotlin接口可以定义变量,和接口中的方法一样,类实现接口时必须重写字段。

可见性

可见性官方文档

关键字 可见范围
public 任何看到声明类的客户都会看到其public成员
private 表示仅在此类中可见(包括其所有成员)
protected 与private子类中的+可见相同
internal 模块内可见
继承、实现

kotlin和java一样,只能单继承,可以实现多个接口

原型

class 类名{

}
或者
class 类名:接口1,接口2,接口3,父类{

}

使用举例

定义父类ClassParent,open关键字修饰后才可以被继承

open class ClassParent(data: String) {
/**
* 父类中字段
*/
var dataParent: String? = data
}
定义一个接口InterfaceParent

interface InterfaceParent {
/**
* 抽象字段
*/
var dataInterface: String

/**
* 接口中的抽象方法,实现接口后必须重写
*/
fun setData(data: Int)

/**
* 接口中带方法体的方法
*/
fun setData2(data: Int) {
//接口中的方法可以有方法体
}
}
ClassA实现接口InterfaceParent、继承父类ClassParent

class ClassA : ClassParent, InterfaceParent {
var dataA: Int? = null

/**
* 接口中的抽象字段,实现接口时候必须重写
*/
override var dataInterface: String = ""

/**
* 类的初始化块
*/
init {
dataInterface = "类的初始化块"
}

/**
* 父类有一个带参数的构造方法,子类必须重写
*/
constructor(data: String) : super(data) {

}

/**
* 多参数构造方法
*/
constructor(data: String, dataA: Int?) : super(data) {
this.dataA = dataA
}

/**
* 重写InterfaceParent中方法
*/
override fun setData(data: Int) {
dataA = data
}
}
 
方法
kotlin中方法概念和java相同,方法原型和java不同,功能比java强大,支持函数作为参数和返回值(高阶函数)

普通方法

方法原型
fun 方法名(参数1:参数类型,参数2:参数类型):返回值类型{

//实现功能

}
使用举例

无参无返回

/**
* 定义一个无参方法打印data的值
* 方法返回值是void
*/
fun printData() {
Log.i(log, "data=$data")
}
有参有返回值

/**
* 定义参数为String、Boolean的方法
* 方法返回值是Boolean
*/
fun printData(d: String, b: Boolean): Boolean {
data = d
this.b = b
Log.i(log, "data=$data ; b=${this.b}")
return b
}
参数默认值方法

方法定义时候参数设置默认值,调用方法时候有默认值的参数可以不传递,kotlin自动使用默认值
使用举例
定义方法reformat,normalizeCase、upperCaseFirstLetter默认为true,divideByCamelHumps默认false

fun reformat(
str: String,
normalizeCase: Boolean = true,
upperCaseFirstLetter: Boolean = true,
divideByCamelHumps: Boolean = false
) {
//实现功能
}
使用reformat方法

reformat("")
reformat("", false)
reformat("", false, upperCaseFirstLetter = false)
reformat("", false, upperCaseFirstLetter = false, divideByCamelHumps = false)
方法原型
使用举例

高阶函数(详见底部高阶函数介绍)

静态方法、变量
官方文档
kotlin静态方法、变量类似java中public static final修饰的变量、方法,使用companion object包裹即可,常量需要const修饰

companion object {
//放置静态方法、变量
}
使用举例
定义一个类

class StaticData {
companion object {
//常量需要const修饰
const val staticVal = "类似于java的public static final "
var staticVar = ""
fun setStaticData(data: String) {
staticVar = data
}
}
}
使用静态常量、方法

val temp = StaticData.staticVal
StaticData.staticVar = temp
StaticData.setStaticData(temp)
控制流
官方文档

if使用

与java中if类似使用

// Traditional usage
var max = a
if (a < b) max = b

// With else
var max: Int
if (a > b) {
max = a
} else {
max = b
}

// As expression
val max = if (a > b) a else b
for使用

与java的for类似使用,功能略强
collection为定义的集合,step count为循环步进,默认为1

for (item in collection step count){
print(item)
}
在1-3之间遍历,步进为1

for (i in 1..3) {
println(i)
}
在1-6之间遍历,步进为2

for (i in 6 downTo 0 step 2) {
println(i)
}
when使用

类似java的switc,功能比switch强大,case条件可以时常量、集合、表达式、类型,when条件可以时一个表达式

val list = ArrayList<Int>()
var data = 1
when (data) {
1 -> {
//等于1
}
2 -> {
//等于2
}
in 3..5 -> {
//在3-5之间
}
in list -> {
//在list集合中
}
!in 6..7 -> {
//不在6-7之间
}
is Int -> {
//类型为Int时候
}
else -> {
//其它,default
}
}
 
协程
官方文档
百度百科定义协程:
协程不是进程或线程,其执行过程更类似于子例程,或者说不带返回值的函数调用。一个程序可以包含多个协程,可以对比与一个进程包含多个线程,因而下面我们来比较协程和线程。我们知道多个线程相对独立,有自己的上下文,切换受系统控制;而协程也相对独立,有自己的上下文,但是其切换由自己控制,由当前协程切换到其他协程由当前协程来控制。
需要单独依赖库

api "org.jetbrains.kotlinx:kotlinx-coroutines-android:$kotlinx_coroutines"
通过GlobalScope使用,Dispatchers定义协程执行在什么线程,可选IO、MAIN、Default,耗时操作一般在IO线程执行,kotlin通过线程池管理IO线程;刷新界面使用MAIN,默认在调用处所在线程时使用Default。GlobalScope.launch执行时候会有一个返回值,调用返回值中的
join方法可以让主协程或者线程卡在join处,直到子协程执行完成;
cancel方法取消协程;
cancelAndJoin方法取消并等待子协程

GlobalScope.launch(Dispatchers.IO) {

}
使用举例
1、开启子线程执行任务

GlobalScope.launch(Dispatchers.IO) {
//这里是在子线程
//延迟500毫秒
delay(500)
Log.i(log, "这里是协程1,Thread id=${Thread.currentThread().id}")
}
2、子线程执行,结果返回主线程

GlobalScope.launch(Dispatchers.Main) {
val job = GlobalScope.launch(Dispatchers.IO) {
//这里是在子线程
delay(2000)
Log.i(log, "这里是IO协程,Thread id=${Thread.currentThread().id}")
}
//这里是在UI线程
//主协程会阻塞在这里,直到子协程执行完成
job.join()
//取消任务
//job.cancel()
//取消job并且等待它完成
//job.cancelAndJoin()
Log.i(log, "这里是Main协程,Thread id=${Thread.currentThread().id}")
}
3、定时任务

GlobalScope.launch(Dispatchers.IO) {
repeat(10) { i ->
//这里是在子线程,10此重复时,每次的线程可能不相同
Log.i(log, "I‘m repeat $i ...,Thread id=${Thread.currentThread().id}")
delay(100)
}
}
高阶函数
高阶函数简单理解就是函数的参数或者返回值是函数的函数
原型
fun hight(a:funA,b:funB):funC{

}
使用举例
普通2个普通函数,返回Int类型数据,kotlin中函数的定义可以和变量一样使用val定义

private val data1 = fun(): Int {
return 10
}

private val data2 = fun(): Int {
return 2
}
将函数用作一个函数的返回值的高阶函数

fun getData2(): () -> Int {
return data2
}
定义高阶函数higherFunction

/**
*
* @param aFun 一个无参数,返回值类型为Int的函数类型
* @param cFun 一个无参数,返回值类型为Int的函数类型
* @param bFun 一个有两个Int类型参数,返回值类型为Int的函数;类型
* @return Int类型
*/
private fun higherFunction(
aFun: () -> Int,
cFun: () -> Int,
bFun: (a: () -> Int, b: () -> Int) -> Int
): Int {
//将参数a、c传入到参数b(函数),得到结果
return bFun.invoke(aFun, cFun)
}
定义高阶函数higherFunctionAdd

/**
* 高阶函数higherFunctionAdd、higherFunctionSubtract、higherFunctionMult
* @param aFun 一个无参数,返回值类型为Int的函数
* @param bFun 一个无参数,返回值类型为Int的函数
* @return Int类型
*/
private val higherFunctionAdd = fun(aFun: () -> Int, bFun: () -> Int): Int {
//调用函数aFun、bFun
return aFun.invoke() + bFun.invoke()
}
定义高阶函数higherFunctionSubtract

private val higherFunctionSubtract = fun(aFun: () -> Int, bFun: () -> Int): Int {
//调用函数aFun、bFun
return aFun.invoke() - bFun.invoke()
}
定义高阶函数higherFunctionMult

private val higherFunctionMult = fun(aFun: () -> Int, bFun: () -> Int): Int {
//调用函数aFun、bFun
return aFun.invoke() * bFun.invoke()
}
使用高阶函数

//使用高阶函数higherFunction,实际是data1 + data2 ,(10 + 2)
val res = higherFunction(data1, getData2(), higherFunctionAdd)

//使用高阶函数higherFunction,实际是data1 - data2 ,(10 - 2)
val res2 = higherFunction(data1, getData2(), higherFunctionSubtract)

//使用高阶函数higherFunction,实际是data1 * data2 ,(10 * 2)
val res3 = higherFunction(data1, getData2(), higherFunctionMult)

原文地址:https://www.cnblogs.com/1506asd/p/11723361.html

时间: 2024-08-30 15:06:48

快 三 大 神 带 回 血 是 真 的 还 是 假 的的相关文章

大 发 快 三 邀 请 码 回 血 计 划 17000077

[〓微微 导师:836840888〓][邀 请 码17000077][网纸 1dd.app][信誉平台][资金保障][实力说话]生活不如意十之八九,因此,我们总是不满意的多.人的满意分为两种,一种对自身的,一种是对外界的.外界我们控制不了,外界常常令我们促不及防的产生不愉快,如下班时今天没赶上末班车,早上上班时堵车,这些外界的不愉快不可避免的会影响我们自己的不满意,是不是我天生的命不好,倒霉事全占了,是不是天生就不行,为什么那么多的不如意? 这时,人就会产生自怨自艾的情绪,说到这个自怨自艾,能够

Django 大神带你飞系列~走进Django

Django 大神带你飞系列~走进Django Django开端 1.0 django 开端 1.1 web应用的本质 1.2 HTTP协议 1.3 路由系统 1.4 Django的安装和启动 1.5 django的路由介绍 1.6 Django的模版介绍 1.7 Django的网页操作流程 1.8 Django的链接数据库操作 Django的路由系统 1.0 Django的路由系统 1.1 创建app 1.2 路由的分组 1.3 路由的分法 Django的orm模型 1.0 Django 的o

老猪带你玩转自定义控件三——sai大神带我实现ios 8 时间滚轮控件

ios 8 的时间滚轮控件实现了扁平化,带来很好用户体验,android没有现成控件,小弟不才,数学与算法知识不过关,顾十分苦恼,幸好在github上找到sai大神实现代码,甚为欣喜,顾把学习这个控件点滴记录下来,分享给大家.项目原地址https://github.com/saiwu-bigkoo/Android-PickerView. ios 8 滚轮的效果: 而sai大神控件的效果: 哎,妈呀是不是效果95%相识啊. 好了,废话少说,谈谈我从这个控件中收获的心得. 首先,我们要高瞻远瞩看一下

css3动画transform在ie内核动画结束后子元素a标签不能点击(本人未解决,求大神带飞)

问题描述: css3的动画 animation属性,如果动画里面需要动画的元素是transform,那么动画的这个元素的子元素a标签就不能 点击跳转,也不能运行点击事件,就好像个a标签被透明的东西挡住了一样,目前只是发现这个问题在ie内核的浏览器上面,比如 360浏览器,ie11(考虑到测试css3动画的,没有测试ie789 10.).而在火狐,谷歌正常. 百度了一大堆,都没有找到好的解决办法,比较接近的一个说法是,transform属性改变了元素的层级,也就是z-index属性,不过在这里a标

2018年最新-JAVA大神带你做年薪过50万的架构师

一.作为企业架构师,我们为什么需要构建数据结构? 数据结构主要有以下内容: 1)数据标准不一致 2)数据模型管理混乱 3)深入的性能的问题无法解决 4)SQL语句编写水平不高导致出现严重性能问题 5)开发人员对执行计划收悉 6)上线前缺乏审计 7)相对复杂的数据处理能力欠缺 8)数据质量差需要执行数据质量管理 数据是客户的财富,虽然对于我们开发人员一文不值,在客户那里就是无价之宝,保障数据的完成性,安全性,可靠性, 二.作为一名数据架构师所掌握职责和技术 创建数据管理系统进行整合,集中,保护和维

西南seo大神带你走在时代前沿,方能把我机遇迎接挑战,

走在时代前沿,带领家庭生态农业农庄发展是否怀恋儿时那石磨磨出的面粉,是否对农村的自然风光,清新的空气,叮咚的泉水意犹未尽,是否想念你孩童时的烧洋芋,或是在山上生上柴火掰几个玉米烤熟时的味道,是否很想再追忆一下年轻时嬉戏玩耍的乐趣,我也很怀恋,可是我也很绝望,真的无法,看来只能回家去扎西红了.在互联网+时代发展生态农业和生态农业庄园,走家庭农庄,乡村旅游这条路真的可行吗?不要怀疑,我们走在时代的前沿,相信我,在五年前我就知道了农村电商势必所趋,果然,在2016年,国家对农村电商立项且大力扶持,每个

MySQL DBA大神带你实战MySQL面试(MySQL运维监控常见面试问题汇总)

===============课程目录=============== (1)\第一章 课程介绍:目录中文件数:1个├─(1) 第一章 课程介绍.mp4(2)\第七章 MySQL架构类问题:目录中文件数:1个├─(2) 第七章 MySQL架构类问题.mp4(3)\第三章 用户管理类问题:目录中文件数:1个├─(3) 第三章 用户管理类问题.mp4(4)\第九章 管理及监控类问题:目录中文件数:1个├─(4) 第九章 管理及监控类问题.mp4(5)\第二章 MySQL版本类问题:目录中文件数:1个├

大神带你重新认识Mybatis中强大的resultMap

前言在Mybatis中,有一个强大的功能元素resultMap.当我们希望将JDBC ResultSets中的数据,转化为合理的Java对象时,你就能感受到它的非凡之处.正如其官方所述的那样: resultMap元素是 MyBatis 中最重要最强大的元素.它可以让你从 90% 的 JDBC ResultSets 数据提取代码中解放出来,并在一些情形下允许你进行一些 JDBC 不支持的操作.实际上,在为一些比如连接的复杂语句编写映射代码的时候,一份 resultMap 能够代替实现同等功能的长达

腾讯课堂:腾讯大神带你进阶性能测试

1,性能测试最有用的图:虚拟用户,吞吐量,相应时间,资源利用率的关系图. 2,性能测试工具: jmeter , loadrunner ,tcpcopy , gatling,自己写. 3,微信红包的实例: 微信红包的功能就很复杂:发红包,在群内或是针对个人,发多少个,抢红包请求等. 验证数据的正确性,直接通过脚本很难验证,所以再跑完脚本之后写程序验证正确性,付款正确,收款正确,计算正确等等. 4,面试的时候,一般会问你在实际操作中遇到哪些问题,怎么解决的,复杂的测试实例是什么. 原文地址:http

快 三 专 业 带 人 的 计 划 老 师

导师[扣587~18~601]邀请码[1122 3306]指定官网hct97.com我也是从一败涂地到目前的稳稳盈利,目前我有一套比较稳定的打法,如果目前还在亏损,可以找我,我愿意帮助这个圈子的朋友,毕竟当初我受过其他人的帮助,我乐意结交更多的朋友.人生总是充满诸多的机遇和选择,你选择我我必不让你失望,你选择不信我,我也祝愿你能赢得更多,事实莫过于雄辩,实力才是硬道理,每个人都在努力的通过各种渠道让自己的生活变得更加美好,无论是玩什么都一样,也许有时候我们会感觉到很累,也许我们有时候得不到更多的