List集合

  • API和JAVA基本类似,列举两个Kotlin的特殊API使用,是不可变集合
package com.fyx.s1fun main() {var list = listOf<String>("1", "2", "3", "4")//如果有报错就会进入第二个函数var tag = list.getOrElse(0, {"索引越界了"})//如果获取报错那么则返回nullvar tag2 = list.getOrNull(20)println(tag2)}

可变集合和非可变集合和集合转换

package com.fyx.s1fun main() {//不可变集合 无add方法var list = listOf<String>("1", "2", "3", "4")//可变集合 有add方法var name = mutableListOf("123", "123123", "123213")name.add("123")//可变集合转换为不可变集合val toList = name.toList();
}

mutator函数学习

  • 我们可以使用mutator运算符去操作List对象的添加和修改
package com.fyx.s1fun main() {//这里必须声明为valval name = mutableListOf<String>("ada", "ccc", "eee")//mutator特性,底层就是对运算符的重载name += "fff"println(name)name -= "ada"println(name)
}

集合遍历

package com.fyx.s1fun main() {//这里必须声明为valval name = mutableListOf<String>("ada", "ccc", "eee")//常规遍历for (data in name) {println("数据是$data")}//函数遍历name.forEach {println("foreach遍历$it ")}//函数索引遍历name.forEachIndexed { item, index ->println("索引是$index 值是$item")}}

结构语法解析过滤

package com.fyx.s1fun main() {//这里必须声明为valval name = mutableListOf<String>("ada", "ccc", "eee")//结构语法解析var(name1,name2,name3) =nameprintln(name1)//结构语法过滤_ 不取第一个元素var(_,name5,name6) =name
}

不可变不重复元素集合

package com.fyx.s1fun main() {//这里必须声明为valval name= setOf<String>("123","123","321")//天然去重println(name.size)//获取元素println(name.elementAt(1))//防止索引越界等其它异常name.elementAtOrElse(7,{"索引越界了"})}

可变不重复集合

package com.fyx.s1fun main() {//这里必须声明为valval name = mutableSetOf<String>("123", "123", "1232")name += "123213"name += "123213231"name.add("1123")println(name)}

集合转换

package com.fyx.s1fun main() {//这里必须声明为valval name = mutableListOf<String>("123", "123", "1232")println(name.size)val toSet = name.toSet();println(toSet.size)//函数去重 底层还是将数据转为Set去重val names = mutableListOf<String>("123", "123", "1232")println(names.distinct().size)}

Map定义和使用

fun main() {//基础定义添加值var name = mapOf<String, Double>("Key" to (562.21), "Tom" to (27.12))//通过Paid函数添加var names = mapOf<String, Double>(Pair("Key", 29.22))//获取key值var value = name["Key"]println(value)val get = name.get("Key")println(get)//获取空值返回报错val orDefault = name.getOrDefault("Noexit", -1);val orElse = name.getOrElse("Noexit", { "测试" })//循环遍历1for (entry in name) {println("key值是${entry.key} value值是${entry.key} ")}//循环遍历2name.forEach {println("key值是${it.key} value值是${it.key} ")}//循环遍历3name.forEach { k,v ->println("key值是${k} value值是${v} ")}
}

可变Map使用

package com.fyx.s1fun main() {val map: MutableMap<String, Int> = mutableMapOf()map += Pair("kavin", 13)map.put("Kavens", 15)//如果获取不到就添加 Kavenss和20map.getOrPut("Kavenss", { 20 })
}

创建对象和字段Kotlin的内部流程

package com.fyx.s1class Person {//类比java 中的 @notnull private String name="" 并生成get set 函数var name: String = ""//类比java 中的  private String name="" 并生成get set 函数var age: Int? = null//当声明为val 那么该字段只有get函数,意思是在对象初始化的时候就要赋值val names = "String"//重写get函数,返回1-100中的数据val age12: Intget() = (1..100).shuffled().first();fun getNum(): String {return age?.let {"我是有值的$it"} ?: "我是没值的"}
}fun main() {//Person person1= new Personvar person1 = Person()//类比setAge("18")person1.age = 20//类比getAgeval age = person1.ageprintln(age)//计算属性println(person1.age12)//防范竞态条件 如果该参数可能是空的情况下那么就会强制要求程序员完成非空的逻辑判断println(person1.getNum())
}

对象构造函数的使用

package com.fyx.s1//构造函数里面的值是临时变量,需要声明对应的成员变量才能够使用
class KtBase2(_name: String, _age: Int, _sex: String) {var name = _namevar age = _agevar sex = _sexfun shoumes() {this.namethis.agethis.sexprintln("${this.name}${this.age}${this.sex}")}
}fun main() {var person1 = KtBase2(_name = "西野", _sex = "男性", _age = 18)person1.shoumes()}
  • 当然这样的写法也是很复杂的,kotlin为我们提供了更简化的操作只需要在临时变量里面加var 或者val修饰符就默认为我们生成字段,和get&set方法
package com.fyx.s1//构造函数里面的值是临时变量,需要声明对应的成员变量才能够使用
class KtBase2(_name: String, _age: Int, _sex: String) {var name = _namevar age = _agevar sex = _sexfun shoumes() {this.namethis.agethis.sexprintln("${this.name}${this.age}${this.sex}")}
}fun main() {var person1 = KtBase2(_name = "西野", _sex = "男性", _age = 18)person1.shoumes()}package com.fyx.s1//构造函数里面的值是临时变量,需要声明对应的成员变量才能够使用
class KtBase2(var name: String,var age: Int,var sex: String) {fun shoumes() {this.namethis.agethis.sexprintln("${this.name}${this.age}${this.sex}")}
}fun main() {var person1 = KtBase2(name = "西野",sex = "男性", age = 18)person1.shoumes()}

主构造,和次构造

  • 类()是主构造函数, constructor是次构造函数,此构造总是需要调用主构造的方法
fun main() {var person1 = Kt1(name = "范", age = 12)var person2 = Kt1(age = 12, name = "范", sex = 2)person1.tostring()person2.tostring()}//这里注意已经存在name 和age字段 主构造可以直接生成,而此构造函数是不能使用var 或者val关键字的
class Kt1(var name: String, var age: Int) {var sex: Int? = null//次构造函数constructor(name: String, age: Int, sex: Int) : this(name, age) {this.sex = sex}fun tostring() {println("${this.age}${this.name}${this.sex?.let { it } ?: "我没值"}")}
}

init和构造器执行顺序

  • 调用次构造发现也是先走住构造函数
package com.fyx.s1import sun.plugin.dom.core.Text//构造器执行顺序,init相当于java的构造器{}
class KtBase2(var name: String, var age: Int, var sex: String) {init {println("主构造执行了")}constructor(name: String, age: Int) : this(name, age, "28") {println("次构造执行了")}
}fun main() {var person1 = KtBase2(name = "西野", age = 18)println(person1.sex)
}

构造调用执行顺序

//第一步调用主构造
class Animal(_name: String, val age: Int) {//第二部//和初始代码块儿并行执行,谁在前谁先执行val name = _name//第二部//和字段码块儿并行执行,谁在前谁先执行init {val sortName = _nameprintln("初始块儿执行了$sortName")}//第二部//和初始代码块儿并行执行,谁在前谁先执行val desc: String = "个人简介"//第三步constructor(_name: String, age: Int, sex: Int) : this(_name, age) {println("调用次代码块儿")}
}fun main() {//代码执行顺序val animal = Animal("老王", 19, 2)println(animal.name)
}

惰性加载1

  • 使用lateinit 关键字延迟加载(注:惰性加载的字段必须是var,因为val在初始化就要赋值)
class Person() {//懒加载lateinit var name: Stringfun show1() {//直接调用懒加载的数据会报错//println(name)if(::name.isInitialized) println("初始化过了") else println("没初始化过")}
}fun main() {var person1 = Person();person1.show1()
}

惰性加载2

  • 这里我们发现运行的时候加载中就已经输出了,五秒后才会返回值
class Person() {//饿汉式val name = createData()private fun createData(): String {println("加载中............")println("加载中............")println("加载中............")println("加载中............")println("加载中............")return "老王数据已加载"}}fun main() {var person1 = Person();Thread.sleep(5000)println(person1.name)
}

惰性加载3

  • 懒汉式 在用到的时候才会执行
class Person() {//懒汉式val name by lazy { createData() }private fun createData(): String {println("加载中............")println("加载中............")println("加载中............")println("加载中............")println("加载中............")return "老王数据已加载"}}fun main() {var person1 = Person();Thread.sleep(5000)println(person1.name)
}

Kotlin入门第四节相关推荐

  1. Android零基础入门第11节:简单几步带你飞,运行Android Studio工程

    2019独角兽企业重金招聘Python工程师标准>>> 之前讲过Eclipse环境下的Android虚拟设备的创建和使用,现在既然升级了Android Studio开发工具,那么对应 ...

  2. Android零基础入门第30节:两分钟掌握FrameLayout帧布局

    原文:Android零基础入门第30节:两分钟掌握FrameLayout帧布局 前面学习了线性布局.相对布局.表格布局,那么本期来学习第四种布局--FrameLayout帧布局. 一.认识FrameL ...

  3. Android零基础入门第25节:最简单最常用的LinearLayout线性布局

    原文:Android零基础入门第25节:最简单最常用的LinearLayout线性布局 良好的布局设计对于UI界面至关重要,在前面也简单介绍过,目前Android中的布局主要有6种,创建的布局文件默认 ...

  4. Android零基础入门第33节:Android事件处理概述

    原文:Android零基础入门第33节:Android事件处理概述 通过对Android基本组件的学习,也有接触少部分Android的事件处理,比如按钮的点击事件.选框的状态切换事件. 一.Andro ...

  5. Android零基础入门第7节:搞定Android模拟器,开启甜蜜之旅

    原文:Android零基础入门第7节:搞定Android模拟器,开启甜蜜之旅 在前几期中总结分享了Android的前世今生.Android 系统架构和应用组件那些事.带你一起来聊一聊Android开发 ...

  6. Android零基础入门第83节:Activity间数据传递方法汇总

    2019独角兽企业重金招聘Python工程师标准>>> 在Activity间传递的数据一般比较简单,但是有时候实际开发中也会传一些比较复杂的数据,本节一起来学习更多Activity间 ...

  7. Android零基础入门第31节:几乎不用但要了解的AbsoluteLayout绝对布局

    原文:Android零基础入门第31节:几乎不用但要了解的AbsoluteLayout绝对布局 前面几期基本学习了Android开发中常用的四种布局,之所以把AbsoluteLayout放在后面来学习 ...

  8. Android零基础入门第1节:Android的前世今生

    原文:Android零基础入门第1节:Android的前世今生 现在网上有很多各色Android资料了,但相对来说还是比较零散,Android覆盖的范围极广,最近刚好有机会全部拉通整理一遍,也保存起来 ...

  9. Android零基础入门第75节:Activity状态和生命周期方法

    前面两期我们学习了Activity的创建和注册.以及启动和关闭,也学会了重写onCraete方法,这些知识在实际开发中远远不够,还需要学习了解更多. 生命周期就是一个对象从创建到销毁的过程,每一个对象 ...

最新文章

  1. Git pull[push] 不用每次输入用户名和密码
  2. html5点线的设置,html5 Canvas画图教程(2)—画直线与设置线条的样式如颜色/端点/交汇点...
  3. Spring集成和Web服务
  4. C++查看各种数据类型所占字节和最大最小值(数据范围)
  5. python总结教程_python基础教程总结10——文件
  6. sharpssh远程linux监控系统,利用SharpSsh远程执行linux的shell命令
  7. mysql主码列允许null_mysql的一些基本操作
  8. Oracle数据库merge into的使用,存在则更新,不存在则插入
  9. 软件系统换服务器地址,软件系统换服务器地址
  10. S7-1500 SD卡格式化
  11. 【音视频数据数据处理 6】【RGB篇】将RGB24图片转为YUV420格式图片
  12. 使用Chrome inspect进行夜神模拟器里app的调试
  13. 数据网络卡顿怎么处理_电信数据网络卡顿怎么办 电信iptv卡顿解决方法
  14. HML_FwLib_8051使用补充说明
  15. 马云:心要善,刀要快 | 内部干货
  16. 主成分分析(Principal Component Analysis,PCA)
  17. java设计模式都有哪些?
  18. 25779.html
  19. Ajax之父Jesse James Garrett在adaptive path工作坊上的演讲《用户体验的要素》
  20. 一个前端er写在2015年末的话

热门文章

  1. Java如何获取IP属地 ip2region failed to create searcher with x:java.io.FileNotFoundException:( 系统找不到指定的路径)
  2. keil_5.26 MDK版,汉化
  3. Pointofix ,截屏神器,好用到飞的软件
  4. 百数智慧社区细分领域合作案例展示
  5. Oracle更新(update)
  6. STM32串口输出字符串
  7. 关于iPhone X下Home Indicator(白条)的隐藏和延迟响应
  8. 手机已连接但无法访问互联网,碰到这个情况怎么破?想不到是这样
  9. #Revit二次开发# 创建剖面视图
  10. Yolov5训练自己的数据集(windows10)