当前位置:   article > 正文

Kotlin和java混合开发

kotlin和java混合开发

Kotlin和java混合开发

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()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

空安全类型:
在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)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

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
  • 1
  • 2
  • 3

正则表达式:
可以使用Raw String 定义正则表达式,这样就不需要去对字符转义操作

1 可以直接使用java的Pattern对正则表达式操作:

2 也可以用kotlin的Regex:

Regex(正则表达式).findAll(字符串).toList().flatMap(MatchResult::groupValues).forEach(::println)
  • 1

集合类
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")
  • 1
  • 2

ArrayList则可以增删

val myarraylist=ArrayList<String>
myarraylist.add("Hello")
myarraylist.add("Kotlin")
myarraylist.remove("Hello")
myarraylist.removeAt(1)
  • 1
  • 2
  • 3
  • 4
  • 5

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();
		}
	}
}
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

而Kotlin :

val file =File("文件名")
val bufferedReader = BufferedReader(FileReader(file)).use{
while(true){
	val line = bufferedReader.readLine()?:break
	println(line)
}
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

通过use方法包含方法体,可以省略使用.close的操作


kotlin也提供了很多的扩展方法,对小文件读取,可以简化代码

File("文件名").readLines().forEach(::println)
  • 1

装箱和拆箱:
java有 int, double,boolean等基本类型,还有Int,Double,Boolean等对象类型
装箱:将基本数据类型 int, double,boolean等类型转化为Int,Double,Boolean对象类型,这个过程是java虚拟机自动对其转换的
拆箱:装箱的逆过程

而kotlin只有Int,Double,Boolean对象类型,会自动对数据类型装箱


注解处理器
如使用dagger2实现注解方式的依赖注入
kotlin:
首先要在项目工程中:

apply plugin:"kotlin-kapt"
  • 1

如果你以前使用 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"
  • 1
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/580839
推荐阅读
相关标签
  

闽ICP备14008679号