目录

Kotlin的跨平台特性

声明变量和内置数据类型

数据类型

getter和setter

循环语句

Lambda表达式(匿名函数)

it关键字

简略写法

具名函数引用 (::)

闭包

继承

无主构造

Null 安全

安全调用操作符 ( ?. )

let函数

非空断言操作符 ( !!. )

空合并操作符 ( ?: )

异常

自定义异常

先决条件函数

String

substring()

split()

replace()

标准库函数

Apply

run

With


Kotlin的跨平台特性

Java跨平台的实现是通过JVM生成二进制字节码并且,并通过各个平台特质的JVM运行,而Kotlin 可以编译成 Jvm 字节码运行在 Java 虚拟机上,也可以编译成 JavaScript 运行在浏览器、Node 等 JavaScript 环境中,甚至可以编译成机器码,直接运行在机器本地环境中

声明变量和内置数据类型

var 和 val :

var是可变变量(可读可写),val是可读变量(只能读)

声明变量格式:

var/val 变量名 [:数据类型]  =  值

注:(有初始值时,中括号中可省略,kotlin会进行类型推导)

数据类型

getter和setter

Kotlin中getter 和 setter 都是可选,只需控制变量修饰符,比如:

val不允许设置setter函数,因为它是只读的。

循环语句

Kotlin有两种循环方式,while和for-in,while与java中的while没有区别,for-in是对Java for-each的加强,Kotlin舍弃了for-i的写法,for-in需借助区间来使用

其中

  1. unitl关键字实现左闭右开
  2. step关键字实现跳步
  3. downTo关键字实现降序循环

Lambda表达式(匿名函数)

定义时不取名字的函数,匿名函数通常整体传递给其他函数,或者从其他函数返回,对kotlin很重要,有了它就可以根据需要制定特殊规则,轻松定制标准库里的内置函数

fun main() {val totalS  = "Mississippi".count { letter -> letter == 's' }println(totalS)
}

函数类型和隐式返回

kotlin中匿名函数也有类型,匿名函数可以当做变量赋值给函数类型变量,就像其他变量一样,匿名函数就可以在代码里传递了,变量有类型,变量可以等于函数,函数也会有类型,函数的类型,由传入参数和返回值决定,匿名函数也可以进行类型推断

和具名函数不同,除了极少数情况下,匿名函数不需要return关键字返回数据,匿名函数会隐式或自动返回函数体最后一行语句的结果

var blessingFun ={name:String,year:Int->val holiday = "New Year""$name,$year,$holiday"
}

it关键字

定义只有一个参数的匿名函数时,可以使用it关键字来表示参数名,当参数大于一个时it不能使用

如上代码可以替换成

var blessingFun :(String)->String={val holiday = "New Year""$it,$holiday"
}

简略写法

如果一个函数的lambda参数排在最后,或者是唯一的参数,name括住lambda值参的一对圆括号就可以省略

fun main() {//简略写法show("coke"){goods:String,num:Int ->  val currentYear = 2027"${currentYear}年,双11${goods}促销倒计时${num}小时"}//这个{}中的代码其实是参数
}
//具名函数 参数为匿名函数
private fun show (goods:String,getDiscountWords :(String,Int)->String){val num = (0..24).shuffled().last()//.shuffled()打乱 .last()取最后println(getDiscountWords(goods,num))
}

运行结果:

具名函数引用 ::

要把函数作为参数传给其他函数使用,除了传lambda表达式,kotlin还提供了其他方法,传递函数引用,函数引用可以把一个具名函数转换成一个值参,使用lambda表达式的地方都可以使用函数引用

闭包

在Kotlin中,匿名函数能修改并引用定义在自己的作用域之外的变量,匿名函数引用这定义自身的函数里的变量,kotlin中的Lambda就是闭包

能接收函数或者返回函数的函数又叫做高级函数,高级函数广泛应用于函数式编程当中

//函数类型作为返回值
fun main() {val getDiscountWords : (String)->String = configDiscountWords()println(getDiscountWords("牙膏"))
}fun configDiscountWords():(String)->String{//局部变量val num = (0..24).shuffled().last()val currentYear = 2027return {"${currentYear}年,双11${it}促销倒计时${num}小时"}
}

继承

Kotlin中继承使用  “ : ” 连接父类,后接父类的构造 父类需使用open关键字修饰 如下

先调用父类init在调用子类init,类似于java中的初始化代码块static{},但是init{}是在构建对象时执行

无主构造

若类不使用主构造,则后续继承类也不需要使用构造,即可去掉继承类的(),次构造可以调用父类构造super进行初始化,但是次构造的参数在其他地方无法引用

Null 安全

在Java中空指针异常经常出现,而kotlin对其进行了可空性改良,采用在类型后加?来进行null的赋值管理,不加不能赋null值,例:

安全调用操作符 ( ?. )

kotlin区分可空类型和非空类型,所以如果让一个可空类型变量运行,而他又有可能不存在,针对这种潜在危险,Kotlin不允许在可空类型值上直接调用函数,采用在变量后加?.调用,例:

编译器见到有安全调用操作符,所以它知道如何检查null值。如果遇到null值,它就跳过函数调用,而不是返回null值,这种写法可以实现链式调用

Kotlin
str = str?.uppercase().plus("is great")//链式调用,后面的调用可以不加?,前方已经判断

let函数

安全调用允许在可空类型上调用函数,但是如果还想做点额外的事,比如创建新值,或者判断不为null就调用其他函数,就可以使用带let函数的安全调用操作符,可以在任何类型上调用let函数,它的主要作用是可以在指定作用域内定义一个或多个变量

fun main() {var str:String? = nullvar str1:String? = "butterfly"var str2:String? = ""println(judge(str))println(judge(str1))println(judge(str2))
}
fun judge(str : String?): String? {//安全调用操作符return str?.let{//非空白的字符串if (it.isNotBlank()){it.uppercase()}else{"not null"}}
}

运行结果:

非空断言操作符 !!.

?.是当变量为null时不会调用匿名函数,而如果一定想调用就需要非空断言操作符,!!.又称感叹号操作符,当变量值为null时,会抛出异常

Kotlin
println(str!!.uppercase())

空合并操作符 ?:

?:操作符的意思是,如果左边的求值结果为null,就直接使用右边的结果值,它也可以和let函数一起使用来代替  if/else 语句

var str:String? = null
var strWithSafe:String = str ?: "HelloWord" //基础用法
//代替  if/else
fun main (){var str :String? = nullstr = str?.let{it.uppercase()} ?: "HelloWord"
}

异常

异常的继承关系和try/catch写法与Java中无差别

Kotlin
fun main() {
    var number:Int? = null
    try {
        number!!.plus(1)
    } catch (e: Exception) {
        println("操作不当")
    }
}

自定义异常

Kotlin
fun main() {
    var number:Int? = null
    checkException(number)
}
fun checkException(number: Int?){
    number ?: throw UnskillledException()
}
class UnskillledException() :IllegalArgumentException("操作不当")

先决条件函数

kotlin标准库提供的便利函数,使用这些内置函数,可以抛出带自定义信息的异常,这些便利函数又叫做先决条件函数,可以用它定义先决条件,条件必须满足,目标代码才能执行

  • checkNotNull:如果参数为null,则抛出IllegalStateException,否则返回非null值
  • require:如果参数为false,则抛出IllegalArgumentException
  • requireNotNull:如果参数为null,则抛出IllegalStateException,否则返回非null值
  • error:如果参数为null,则抛出IllegalStateException并且输出错误信息,否则返回非null值
  • assert:如果参数为false,则抛出AssertError,并打上断言编译器标记

Kotlin
fun checkException(number: Int?){
//    number ?: throw UnskillledException()
    checkNotNull(number){
        "something is not good"
    }
}

String

substring()

字符串截取函数,与Java区别在于Kotlin中支持IntRange类型(表示一个整数范围的类型)的参数,until创建的范围不包括上限值(左闭右开)

Kotlin
fun main() {
    var index :Int = STR.indexOf('!') //取第一个!的下标
    var newStr =STR.substring(0 until index)
    println(newStr)
}

split()

split函数返回值与Java一样为List集合数据,Kotlin中List集合又支持解构语法特性,它允许在一个表达式中给多个变量赋值,解构常用来简化变量的赋值

Kotlin
//字符串分割,
var split = STR.split('!')
println(split)
//解构(一次性给多个变量赋值)
var (origin,dest,proxy) = STR.split("!")
println("$origin$dest$proxy")

replace()

字符串替换函数比Java中的更加强大,它可以传入一个匿名函数,从而配合when操作所有符合条件的字符

Kotlin
var str1 = "the Oracle Technology Network License Agreement for Oracle Java SE."
var str2 = str1.replace(Regex("[abcde]")){
    when(it.value){
        "a" -> "1"
        "b" -> "2"
        "c" -> "3"
        "d" -> "4"
        "e" -> "5"
        else -> it.value
    }
}
println("替换前$str1")
println("替换后$str2")

标准库函数

Apply

apply函数可看做一个配置函数,可以传入一个接收者,然后调用一系列函数来配置它以便使用,如果提供lambda给apply函数执行,它会返回配置好的接收者

Kotlin
fun main() {
    //配置一个File实例
    val file1 = File("D:/workspace/test.txt")
    file1.setExecutable(false)
    file1.setWritable(true)
    file1.setReadable(true)
    //使用apply
    val file2 = File("D:/workspace/test2.txt").apply {
        setExecutable(false)
        setWritable(true)
        setReadable(true)
    }
}

在调用一个个函数类配置接收者时,变量名就省略掉了,这是因为,在lambda表达式里,apply能让每个配置函数都作用于接收者,这种行为有时又叫做相关作用域,因为lambda表达式里的所有函数都是针对接收者的,或者说,它们是针对接收者的隐式调用

run

与applay不同的是,run函数不返回接收者,run返回的是lambda的结果

Kotlin
fun main() {
    var file = File("D:/workspace/test.txt")
    var result = file.run {
        //读整个文件 contains("gread")判断文本中是否有“gread”
        readText().contains("gread")
    }
    println(result)
}

run函数也可以执行具名函数引用( :: )

fun main{val str = "fdsafdsafa"println(str.run(::islong).run (::printLine)) //链式引用
}
fun islong(str:String):Boolean{return str.length>=10
}
fun printLine(isLong:Boolean):String{return if (isLong){"str is toLong"}else{"is gerat"}
}

With

with函数是run的变体,他们的功能和行为是一样的,但with的调用方式不同,调用with时需要值参作为其第一个参数传入

Kotlin
 val str = "fdsafdsafa"
 str=with(str){    //with写法
    if (this.length>10){
   
    "str is toLong"
    }else{
   
    "is great"
    }
}

Android开发——kotlin语法基础相关推荐

  1. Android:Kotlin语法基础

    主函数 fun main(args: Array<String>){println("Hello World") } 复制代码 变量 1.常量 val修饰常量,编译器规 ...

  2. Android开发——Kotlin语言

    语法 变量 类型转换 "不安全的"转换操作符 "安全的"转换操作符 函数 一行代码的情况 运算符 位运算符 程序控制语句 选择结构 循环结构 类和对象 继承与构 ...

  3. Android开发教程JAVA基础(汇总)

    Android游戏开发视频教程(汇总) Android开发教程JAVA基础之Java 概述 Android开发教程JAVA基础之标示符.关键字1 Android开发教程JAVA基础之标示符.关键字2 ...

  4. 【Android开发】计算机网络基础知识点,如何完成网络请求过程?

    (一)计算机网络基础知识:从一次完整的网络请求过程分析 (1)域名解析 1.1)域名与ip地址 (1)ip地址:ip地址是一个32位(4字节)的二进制数(IPV4),常见格式为:192.168.1.1 ...

  5. Android入门,android开发需要什么基础

    前言 非计算机大学毕业, 毕业之后 觉得程序员工资高,就去北京一家培训机构 培训了Android 然后学习一切都非常顺利 ,一学完就找到了工作, 做了 5 年, 当时在一个不大不小的公司帮人做andr ...

  6. Android开发学习(基础)

    Android开发环境的搭建 1.安装jdk开发环境 甲骨文公司jdk1.8下载地址 1.下载安装即可,建议安装到指定文件目录下 2.安装完成之后,配置java的JAVA_HOME环境变量,Andro ...

  7. 深入浅出Android开发!零基础如何成为高级Android开发,成功拿下大厂offer

    Android没凉,只是比以前难混了 多年前Android异军突起,成了新的万亿级市场,无数掘金人涌入,期待可以一展拳脚. 那时候大环境下的手游圈,只要你能有个可以运行的连连看就能找到工作,走上赛道被 ...

  8. android开发基本语法

    Android开发                          2.1布局管理器         线性布局(LinearLayout)                  2.1.1常用属性:   ...

  9. Android开发之入门基础篇--拨号器的四种实现方式

    整理之前的学习笔记,发现了很多在学习Android基础的过程中的一些很适合一些新手开发的代码,想想之前也是一步一个脚印,一行一行的代码敲出来的,虽然这些代码很简单,但是里面的编程思路却是很有学习意义的 ...

  10. 【Android】kotlin语法学习

    1 语法入门 package com.example.kotlinstudyvar age: Int = 18 var name: String = "dindin" var na ...

最新文章

  1. linux 修改主机名 修改ip
  2. CodeForces 679B Bear and Tower of Cubes
  3. 史上最丧心病狂的商品定价套路:如何从数学角度,榨干你身上的每一分钱
  4. linux安装mysql(shell一键安装)
  5. 计算机网络中tdm是什么,计算机网络-复习题(1)
  6. indexOf 方法
  7. 极客大学架构师训练营-架构师技术图谱-大作业二
  8. 写个批处理脚本来帮忙干活--遍历文件夹字符串处理
  9. JSP分页显示(前端处理)
  10. android studio 讯飞语音,讯飞语音 使用步骤(针对androidStudio):语音转文字:(示例代码)...
  11. 解决Spark数据倾斜(Data Skew)的 N 种姿势 与 问题定位
  12. k8s-生产级别构建DeployMent
  13. 低功耗设计(low power design)和UPF介绍(含代码示例)
  14. linux脚本循环创建用户,shell应用之批量添加用户实例
  15. 沙龙报名 | 区块链落地难? 六位专家揭秘京东区块链全景应用
  16. React 学习教程
  17. 通过MACE在Android手机上部署深度学习模型
  18. 【读论文】基于三支决策的不平衡数据过采样方法
  19. 安全产品的核心逻辑-杀毒软件
  20. 【qq机器人】Nonebot2搭建详细教程

热门文章

  1. 纯css写一颗跳动的心
  2. ❤ ❤html canvas面向对象的彩色小球❤ ❤
  3. 数字电子技术-数字逻辑概论
  4. 64位CPU内存限制
  5. php经验之谈,php+mysql经验之谈
  6. 计算机科学与技术审核评估专家,中国农业大学 业务动态 审核评估专家Sir Timothy深度走访网络技术中心...
  7. 北漂四年,25K,程序员,我依然单身!
  8. [报错解决]CondaSSLError: OpenSSL appears to be unavailable on this machine. OpenSSL is required to downl
  9. 【电子学会】2019年12月图形化四级 -- 随机选T恤
  10. nginx proxy_pass 502 这是什么错误?