美文网首页
kotlin最新学习笔记

kotlin最新学习笔记

作者: 加油小李 | 来源:发表于2022-03-30 15:46 被阅读0次

is、as

is是判断类型 as是类型转换。

get 、set

kotlin中自动帮我们实现了get、set方法不过如果你要重写get、set方法也可以

if

当一个函数只有一行代码时可以使用=连接

例如:fun max(one:Int,two:Int)= 0

kotlin中的自动类型推导机制可以自动推导出函数的返回值类型

kotlin中的if语句是可以有返回值的,if代码中每一个条件的最后一句就是返回值

例如:

fun max(one:Int,two:Int):Int(){

val value = if(one>two){
one
}else{
two
}
return value
}

该段代码可以简化成

fun max(one:Int,two:Int):Int{

return if(one>two){
one
}else { two
}
}

该段代码可以进一步精简

例如:

fun max(one:Int,two:Int)=if(one>two) one else two

说明: 方法的返回值省略了 因为kotlin拥有自动类型推导机制

when

当一个函数判断条件过多时也可以使用when语句来代替if语句

例如

fun(name:String)= when(name){
"小张" -> 99
"小李" -> 88
"小王" -> 77
else -> 0
}

when除了可以进行结果匹配外还可以进行类型匹配

例如:

fun kind (value:Number)= when(value)

is Int -> println("vlaue is Int kind")
is Double -> println("value is Double")
is chat ->println("value is chat")
else ->println("value isnent kind")

循环递增,循环递减 .. until downTo step repeat

区间 .. until 循环升序

val value 0 .. 10 表示从0到10的一个区间,包含0和10

val value 0 until 10表示 从0到10的一个区间但不包含10

for in 遍历区间

step 过滤区间中对区间数值进行筛选

fun region(value in 0 until step 4){
println(value)
}

当前代码输出的结果为0,4,8

降序 区间 downTo

fun region(value in 10 downTo 0 ){
println(value)
}

循环 repeat

repeat(2){
1,
2,
3
}

楼上代码表示将1,2,3循环2遍

面向对象

kotlin中的类默认时不可以被继承的,如果想让一个类继承需要在类前面加上open关键字; kotlin中用 : 代替 extends和implements

例如:

Interface Animal(){
fun eat()
fun age()
}

class Cat :Animal(){

override fun eat(){

}

override fun age(){

}

}

实体类

JavaBean 需要在创建类的时候在最前面加上 data
实体类不需要对变量写get set 它自动生成。

例如:

data class Animal(eat:String, age:Int)

单例类。

kotlin中为我们提供了一个使用关键字object 创建单例类的简便做法

例如:
创建单例类:
object class DoGame(){
fun swimming(){
println("I like swimming")
}
}
使用单例类:

class Test(){
DoGame.swimming()
}
使用单例类类似于java中的静态调用

lambda 编程

初始化集合 listOf ;setOf ;mapOf

例如:
val list = listOf(1,2,3)
val set = setOf(1,2,3)
val map = mapOf(1 to 1, 2 to 2 3 to 3)

函数式api。

集合中map的函数式api

用法:
val list=listOf("a","b","c")
val newList=list.map({word:String -> word.toUpperCase()})
for(word in newList){
println(word)
}

上面的代码可以简写为:
val list = listOf("a","b","c")
val newList = list.map{it.toUpperCase()}
for(word in newList){
println(word)
}

kotlin调用java方法时 如果java类是一个接口或抽象方法并且只有一个未实现方法,
则此时就可以使用函数式api

例如:
java 接口 :

public interface OnClickListener(){
void onClick(View v);
}

我们调用的时候可以这样写

botton.setOnClickListener{
v ->
}

空指针检查

java代码写法和kotlin代码进行比较

代码:

public void doStudy(Study study){
study.readBook();
study.doHomeWork();
}

我们调用的时候必须根据逻辑确定传入的必须是Study对象
比如
public void doStudy(Study study){
if ( study != null )
study.readBook();
study.doHomeWork();
}

kotlin中默认所有方法的参数和变量都不可为空(因为kotlin编译器会自动检查变量或参数是否为空,如果为空就报错提示)

上面java代码kotlin可以这样大胆的写(无需关注study对象是否为空)

fun doStudy(study:Study){
study.doReadBook()
study.doHomeWork()
}

可空类型系统 ? ?. ?:

有关 ?

?一般在声明变量或函数时候使用
kotlin中在声明变量或方法参数的时候如果没有用?声明那么默认表示该声明变量不可为空
如果在声明变量或方法参数时加上对变量加上?就表示该类型可为空。

有关 ?.

?.一般在逻辑运算时候使用

用法比较:

Java代码

if (a != null){
a.doSomeThing();
}

楼上代码可以用kotlin简写为:

a ?. dotSomeThing()

该代码表示如果a不为空时执行doSomeThing()方法,如果a为空时什么也不做

有关 ?:

?:用法类似于java中的三目运算符

例如:

val what = if ( goHome != null ){
doHomeWork()
}else{
noDoHomeWork()
}

楼上代码假设goHome是一个字符串,doHomeWork()和noDoHome()返回一个字符串

使用 ?: 可以简写为

val what = doHomeWork() ?: noDoHomeWork()

? ?. it let 联合使用对判空进行统一处理

fun doStudy(study:Study?){
study?.let{
it.doHomeWork()
it.noDoHomework(0
}
}

字符串嵌套

kotlin中的字符串可以使用{},{}大括号内最终是一个字符串 可以放在字符串中进行嵌套

例如:

“Hello ${study.name()}.goHomeed doHomeWork !"

如果${}大括号内只有一个变量的时候可以将大括号省略掉

“Hello $sutdy.name(). goHomeed doHomeWork !”

标准函数 with ,run ,apply

with 标准函数

with函数接收两个参数 第一个参数可以是一个任意对象,第二个参数是一个lambda表达式,并且lambda表达式可以引用第一个参数对象作为上下文,而且最后一行代码作为返回值返回

例如:
val doHomeWork = with(student){
//这里是student的上下文
“value” //是with函数的返回值
}

run 标准函数

run函数需要被一个对象来调用,并且只有一个lambda表达式作为参数,而且lambda表达式中提供调用者对象作为上下文,最后一行代码作为返回值返回。

例如上面代码可以这样写
val doHomework = student.run{
//这里是student的上下文
”value“这里是run函数的返回值
}

apply 标准函数

apply标准函数跟run函数一样唯一的差别是apply函数无法指定返回值而且会自动返回调用对象本身

有关static

方法一,kotlin中使用了 companion object{} 代码块来代替java中的static关键字,
我们在companion object{}代码块中定义的方法都可以使用该类类名直接调用。
koltin使用companion object修改的方法可以使用类名.方法名直接调用。
kotlin使用object 修饰的类可以直接类名.方法名调用

kotlin中object还可以修饰匿名内部类使用

方法二: kotlin还提供了@JvmStatic注解来定义静态方法,但是@JvmStatic注解只能在单例类或companion object{}方法中使用。

方法三:顶层方法,Kotlin会将所有顶层方法全部翻译成静态方法,顶层方法是指哪些没有定义在任何类中的方法,一般定义在类外层或者没有定义类的kotlin文件中的方法

java调kotlin中的一些事项 @JvmOverloads、@JvmStatic、@JvmField、@JvmName、@JvmMultifileClass

@JvmOverloads (修饰方法) 为了解决Java不能重载kotlin有默认参数的方法

例如:一个kotlin类中的一个方法有两个参数,java代码调用这个类里面的方法的时候必须传两个参数,加上@JvmOverloads后可以只传一个参数

@JvmStatic(修饰方法) 为了解决在Java中不能直接调用kotlin 中的静态方法

@JvmField(修饰变量) 为了解决在java中不能直接调用kotlin中的静态变量

@JvmName、@JvmMultifileClass(修饰包,文件)

为了解决Java调用Kotlin文件中的字段或者方法,需要在原来Kotlin文件名基础后面加Kt,加上@JvmName 就可以去掉 后面的Kt,直接文件名调用了,
如果我们在同一包名下面的两个kt文件中,用@file:JvmName(“TestKotlinFile”) 注解了一样的class名字,就会报错,需要添加@JvmMultifileClass解决。

相关文章

网友评论

      本文标题:kotlin最新学习笔记

      本文链接:https://www.haomeiwen.com/subject/zatwjrtx.html