1.命名参数
每个Java开发者的噩梦:大量的参数(例如在Cursors或Android中创建SQLite查询),它们的名字和方法定义中的顺序。如果没有文档或IDE帮助,您无法在Java中正确编写它
@Override public Loader<Cursor> onCreateLoader(int i, Bundle bundle) { return new CursorLoader(this, CONTENT_URI, proj, null, null, null); }
幸运的是,Android Studio团队添加了有用的功能,突出显示了传递给这种功能的参数的名称。但是,Kotlin在没有IDE帮助的情况下实现同样的效果也很容易
2.数据类
对Kotlin来说,这可能是Java编程人员最有用,最“壮观”的选择之一。数据类使每个开发人员的生活变得更加简单,因为它仅用一行代码表示我们心爱的POJO类
Java:
public class Person { private final String name; private final int age; public Person(String name, int age) { this.name = name; this.age = age; } public String getName() { return name; } public int getAge() { return age; } }
Kotlin
data class Person(val name: String, val age: Int)
这里做了什么?编译器会自动从主构造函数中声明的所有属性中派生下列成员:
Any类的标准方法(相当于Java中的Object):equals(),hashCode(),copy()
toString() 形式为 Person(name=Michał, age=22)
不再需要getter,setter,直接使用对象属性
它有助于摆脱我们通常不想维护的样板代码 - 在Kotlin中,编译器为我们做了。从现在起,我们可以关注应用程序的实际功能,而不是一次又一次重复相同的代码
3.空安全和安全的调用
Kotlin的主要目标之一是清除空引用异常。它仍然提供可空的类型,但仅限于与Java代码完全协作。默认的Kotlin类型是非空的,如果您试图将它们标记为null,它不会让您编译通过。
var bundle : Bundle = null //won't compile var bundle : Bundle? = null //nullable type, it compiles
Java中的典型情况:
public void sendMessage(@Nullable Person person, @NotNull Mailer mailer, String message) { if (person == null || message == null) return; PersonalInfo personalInfo = person.getPersonalInfo(); if (personalInfo == null) return; String email = personalInfo.getEmail(); if (email == null) return; mailer.sendMessage(email, message); }
同样的情况在Kotlin中:
fun sendMessage(person: Person?, mailer: Mailer, String message){ val email = client?.personalInfo?.email if (email != null && message != null) { mailer.sendMessage(email, message) } }
空检查让我们写更少的代码,使我们的应用程序更好地工作,而且使它看起来更好。这不是很棒吗?
4.拓展属性
当我每次需要删除重复的转换时,扩展属性都可以帮助到我,传统方式,我们可能写出如下代码:
var myBigDecimal = 26 as BigDecimal var otherBigDecimal : BigDecimal = myBigDecimal
所以让我们用扩展属性代替上面的代码
val Int.bd : BigDecimal get() = BigDecimal(this)
在我们扩展Int类后,我们现在可以轻松地将我们的Ints转换为BigDecimals,它的工作原理完全相同:
var myBigDecimal = 26.bd var otherBigDecimal : BigDecimal = myBigDecimal
我们已经完成了所有工作,无需从类继承或使用任何类型的设计模式,例如装饰器。 Kotlin提供了以快速和简单的方式使用新功能扩展课程的功能。
5.智能转换
当涉及类型转换时,Kotlin将表现得十分智能
fun demo(x: Any) { if (x is String) { print(x.length) // x is automatically cast to String } }
关键字 is 相当于Java中的 instanceof,但它具有自己的强大功能。编译器检查if声明中的对象属于哪种实例,然后转换if代码块中的实例属性
when (x) { is Int -> print(x + 1) is String -> print(x.length + 1) is IntArray -> print(x.sum()) }