赞
踩
kotlin继承Java的方法 调用java的方法,参数最好用可空类型,除非明确java的参数是非空
而java代码如果需要可空 可以通过@Nullable 需要不可空 可以通过@Nullable
属性读写
1 kotlin调用java
自动识别 setter和getter
2 java调用kotlin
通过getXX()、setXX()
因为kotlin的属性var firstName: String
是会编译为:
private String firstName;
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
// 如果属性的名称以 is 开头如isOpen 其 getter 会称做 isOpen(),而其 setter 会称做 setOpen()
空安全类型:
在kotlin中可以为空,会有空安全保护,而java没有
因此java调用时要去判断
或者通过注解方式@Nullable 、 @NotNull
常见注解:
kotlin中写,给java使用
1 @JvmField
声明属性为真正的java变量
2 @JvmStatic
声明方法为真正的java静态方法
3 @JvmOverload
如果一个方法有N个参数,其中M个具有默认值,则会生成M个重载:第一个重载使用N-1个参数(除了最后一个具有默认值),第二个重载N-2个参数,可以将kotlin带有默认参数的重载方法可以给java使用
@JvmOverloads fun f(a: String, b: Int=0, c:String="abc"){
}
相当于在Java中声明了3个方法:
void f(String a)
void f(String a, int b)
void f(String a, int b, String c)
4 @file:JvmName
将kotlin文件编译生成的文件名改成想要的名称
改动:
java的通配符?替换成 kotlin的通配符*
SAM (single abstract method)
单一抽象方法
an interface with a single abstract method
可以用lambda表达式代替这个接口实例
但是想移除却未必能移除到该对象
kotlin目前只支持java的接口
kotlin之间要使用得lambda代替则需要用类型别名
typealias 接口名=lambda格式
如
typealias Runnable=()->Unit
正则表达式:
可以使用Raw String 定义正则表达式,这样就不需要去对字符转义操作
1 可以直接使用java的Pattern对正则表达式操作:
2 也可以用kotlin的Regex:
Regex(正则表达式).findAll(字符串).toList().flatMap(MatchResult::groupValues).forEach(::println)
集合类
java中有 list,set,map
List(有序、可重复)
Set(无序、不能重复)
Map(键值对、键唯一、值不唯一)
kotlin中:
list set map 都是不可加和删的,要加和删得用 mutableList,mutableSet,和mutableMap
val myList = listOf("1","Hello","Kotlin","2")
val myMap = MapOf("key","value","1","Hey","2","Hello")
ArrayList则可以增删
val myarraylist=ArrayList<String>
myarraylist.add("Hello")
myarraylist.add("Kotlin")
myarraylist.remove("Hello")
myarraylist.removeAt(1)
kotlin优化了java的根据某个下标移除元素的操作
即 用 removeAt 避免当 ArrayList是int类型,而元素的值又恰好有0的情况
I/O操作
java的文件读取:
File file = new File("文件名"); BufferedReader bufferedReader = new BufferedReader(new FileReader(file)); while(line=BufferedReader.readLine!=null){ System.out.println(line); }catch(FileNotFoundException e){ e.printStackTrace(); }catch(IOException e){ e.printStackTrace(); }finally{ try{ bufferedReader.close(); }catch(IOException e){ e.printStackTrace(); } } } }
而Kotlin :
val file =File("文件名")
val bufferedReader = BufferedReader(FileReader(file)).use{
while(true){
val line = bufferedReader.readLine()?:break
println(line)
}
}
通过use方法包含方法体,可以省略使用.close的操作
kotlin也提供了很多的扩展方法,对小文件读取,可以简化代码
File("文件名").readLines().forEach(::println)
装箱和拆箱:
java有 int, double,boolean等基本类型,还有Int,Double,Boolean等对象类型
装箱:将基本数据类型 int, double,boolean等类型转化为Int,Double,Boolean对象类型,这个过程是java虚拟机自动对其转换的
拆箱:装箱的逆过程
而kotlin只有Int,Double,Boolean对象类型,会自动对数据类型装箱
注解处理器
如使用dagger2实现注解方式的依赖注入
kotlin:
首先要在项目工程中:
apply plugin:"kotlin-kapt"
如果你以前使用 android-apt 插件,请将其从 build.gradle 文件中删除,并用 kapt 取代 apt 配置的用法。如果你的项目包含 Java 类,kapt 也会顾全到它们。
如果为 androidTest 或 test 源代码使用注解处理器,那么相应的 kapt 配置名为 kaptAndroidTest 和 kaptTest。请注意 kaptAndroidTest 和 kaptTest 扩展了 kapt,所以你可以只提供 kapt 依赖而它对生产和测试源代码都可用。
dependencies 中:
kapt "com.google.dagger:dagger-compiler:$dagger-version"
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。