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解决。
网友评论