一,代码更安全
(1)java代码。
示例:
String str = null;
str.getBytes();
原因:忘记赋值,或赋了空值;使用的时候忘了做非空判断。
后果:报错崩溃。
解决办法:写好非空判断。
if(str != null){str.getBytes()}
(2)kotlin代码
var str:String? = null
str.get(0) // 编译无法通过,AS也会提示代码有问题
// 解决办法1
if(str != null){
str.get(0)
}
// 解决办法2
str?.get(0)
变量默认不能为空(必须初始化),如果必须为空需用?声明为可空类型,且在使用时强制非空判断。
综上kotlin更易避免空指针、同时写法更简洁。
PS: kotlin的toString()方法默认做了非空判断。
二,代码更简洁
(1)java代码
public class User {
private String name
private int age;
// 一大堆getter,setter
}
(2)kotlin代码
data class User(var name:String, var age:Int)
有没有很简洁,一行代码搞定。
三,支持lambda表达式
java8也开始支持lambda表达式,所以这一点并不存在优势。
四,默认参数
(1)java代码
public void createInstance(String name, int age, boolean isVip){
User user = new User();
user.SetName(name);
user.setAge(age);
user.setIsVip(isVip);
}
public void createInstance(String name, int age){
User user = new User();
user.SetName(name);
user.setAge(age);
user.setIsVip(false);
}
(2)kotlin代码
fun createInstance(name:String, age:Int, isVip:Boolean = fase){
//初始化对象代码
}
kotlin可以减少重载方法的数量。
五,跟findViewById说再见
(1)java代码
TextView tv = (TextView)findViewById(R.id.tv);
tv.setText();
(2)kotlin代码
import kotlinx.android.synthetic.main.activity_main.*
tv.text = ""
六,不用通过继承的方式给类增加新函数
fun ViewGroup.inflate(layoutRes: Int): View {
return LayoutInflater.from(context).inflate(layoutRes, this, false)
}
以上代码段就是给ViewGroup增加了一个inflate函数