Java 的 Kotlin 特性愿望清单

Java 的 Kotlin 特性愿望清单

协做翻译java

原文:A Kotlin Wishlist for Java算法

连接:https://dzone.com/articles/a-kotlin-wishlist-for-java编程

译者:imqipan, Tocy, dreamanzhao, 句号句号, Tot_ziens设计模式

毫无疑问,当谈到编程语言时,Java 已占领上风,并被认为是最重要的开发语言之一。然而,在基于 JVM 的基础上还开发了一些语言,好比说 Kotlin 。markdown

Kotlin 对于现代化的多平台应用是一种静态类的编程语言。尽管我已经从事 Java 开发有至关长的时间,可是在作一个数据-匿名化的项目时使我感受到 Java 须要从 Kotlin 引入一些东西。编程语言

下面是一些我愿意看到的在 Java 中占有一席之地的 Kotlin 特性。ide

提倡不可变函数

Java 9 引入了工厂方法建立集合,以此提倡不可变。但能在语言级别集成不可变,而非经过包装生成不可变集合将是很是不错的方式。existingDepartments() 是一个 Kotlin 的返回一个不可变字符串列表的函数。优化

Java 的 Kotlin 特性愿望清单

Java 9 在尝试添加、删除一个不可变列表中的元素时将会抛出一个 UnsupportedOperationException 异常。但如可变与不可变的接口彻底隔离,避免给任何不可变集合暴露任何添加、删除的接口将是不错的。ui

//pre Java 8    public List<String> existingDepartments() {   return new ArrayList<String>(){{

            add("Human Resources");

            add("Learning & Development");

            add("Research");

        }};

}//Java 8public List<String> existingDepartments() {   return Stream.of("Human Resources", "Learning & Development", "Research")

               .collect(Collectors.toList());

}//Java 9public List<String> existingDepartments() {   return List.of("Human Resources", "Learning & Development", "Research");

}

清晰对待不可变集合,坚定反对暴露接口而后抛出 UnsupportedOperationExceptions 异常。

方法参数默认为 final

为提高不可变性及避免因为变化致使的错误,至少能够考虑使缺省的方法参数为 final 。

Java 的 Kotlin 特性愿望清单

add() 函数的参数是 val ,其默认是不能改变的,这意味着做为任何函数的客户端,我均可以放心:函数不会改变传递给它的参数(不要与 object mutation 混淆)。

使方法参数默认为 final 可能而且很大可能会破坏 Java 升级后的现存代码基础,但值得一提。

在编译时处理NULL

全部的java开发者必定知道臭名昭著的NullPointerException。Kotlin迈出了重要的一步在编译时处理NULLs。在显式声明以前,一切都是非空的。

Java 8不是出于一样的缘由引入了Optional吗?让咱们看一个例子:

Java 的 Kotlin 特性愿望清单

这个Employee 类具备非空id和可选(可空)部门的主构造函数。为id传递null将致使编译时错误。

departmentName()函数使用可选操做符访问Department的name属性?在可空的字段上,若是department为null,name将会不被访问而且左手边的表达式[department?.name]将会返回null。三元操做符?:若是在表达式的左边为null将会返回右手边的 ("Unassigned")。

//Java 8class Employee {    private Integer id;    private Optional<Department> department    Employee(Integer id, Optional<Department> department){        this.id = id;        this.department = department;

    }    public String departmentName() {        return department.orElse("Unassigned");

    }

}/**

    Employee needs a non-nullable "id" and an optional department to be constructed.

    Employee employee = new Employee(null, null); <b>NPE !!!</b>

**/

Optional不会保护NPE的代码,可是也有它的优势:

  • 它使域模型变得清晰。Employee类有可选的department,这就足以得出结论,每一个员工均可能没有被分配到一个部门。

  • 它在departmentName()方法中促进可组合性。

  • 在编译时处理NULLs应该能够经过删除if语句、对象的形式中的没必要要的NULL检查来实现更干净的代码。Objects.requireNonNull, Preconditions.checkNotNull等其余任何形式(的没必要要的NULL检查)。

  • 为了保持简单,department被传递给构造函数,尽管这是一个可选属性。

改进Lambda表达式

Java 8引入的lambda表达式是创建在函数式接口和函数描述符的基础上的,这就意味着每个lambda表达式都会映射到一个定义在函数式接口中的抽象方法。这是一种高效的方法,他受权给一个只有一个抽象方法(即函数描述符)的接口(即函数式接口)能够建立一个lambda表达式。

Java 的 Kotlin 特性愿望清单

上述代码中,变量isPositive就是一个函数,它接受一个整形变量为参数而且返回一个布尔类型值。这个变量的值就是一个函数的定义或者是定义在花括号中的一个lambda表达式,这个函数能够检查传进来的参数是否大于零。

然而,在下面的代码中,Predicate是包含一个抽象函数test()的函数式接口——他能够接受一个类型为T的参数并返回一个布尔类型值。

所以,isPositive能够接受一个整型变量做为参数并检查这个参数是否大于零。因此咱们须要在使用isPositive时调用test()方法。

Java 的 Kotlin 特性愿望清单

lambda表达式不该该依赖于函数式接口和其中的函数描述符。

支持扩展函数

Kotlin 支持扩展函数,以在无需继承或装饰其余类的状况下给函数提供新功能。

如下是一个扩展函数的案例,返回 String 最后的一个字符。

Java 的 Kotlin 特性愿望清单

lastChar() 是定义在 String 类上的一个拓展函数,这里 String 也被称为接收对象。经过 "Kotlin".lastChar() 来触发函数。

拓展函数在没有继承和任何设计模式的状况下,能够拓展函数新特性。

尾部递归

Kotlin 支持 Tail-recursion(尾部递归)。尾部递归是递归的一种形式,其递归调用的是函数尾部最后的一条指令。这样一来,咱们无须担忧以前的值,一个栈桢知足全部的递归调用;尾部递归是优化递归算法的一种方式。

另外,尾部递归能够很容易的转换为迭代的方式。

Java 的 Kotlin 特性愿望清单

当函数用 tailrec 修饰符标识并知足所需的方式时,编译器会对递归进行优化,并以快速高效的递归版本替换。

实际而言,尾部递归以固定的栈桢空间执行,它只是迭代过程的另外一种表达式。

Java 并不在编译器级别直接支持尾部调用优化,不过能够经过 lambda 表达式实现,可是期待能在编译层面看到尾部递归算法。

其余

  • 移除固有的复制 [new,return,semicolon]:Kotlin 不须要 new 来建立一个实例。若是函数被视为语句而不是表达式,它仍然须要 return 。

Java 的 Kotlin 特性愿望清单

  • 单例类:在 Java 中建立单例类若是有更简单的方法将会很棒。Kotlin 中的等效语法以下所示。

Java 的 Kotlin 特性愿望清单

  • 不可变类: 若是能看到相似 readonly/immutable 修饰符来建立一个不可变类那真是极好的。下面提到的代码片断仅是一个想法(在 Kotlin 或 Java 中不可用)。

Java 的 Kotlin 特性愿望清单

总之,做为开发人员,咱们总会犯错误(漏掉 NULL 检查、改动集合数据等),但在语言级别上提供这些功能将使编程更轻松并尽量避免出现错误。

https://mp.weixin.qq.com/s/OTB5plBaML3mWxjOVvboiA

相关文章
相关标签/搜索