写点什么

Java 8 新特性

用户头像
Bf-Bus
关注
发布于: 3 小时前

Default Methods for Interfaces(接口的默认方法)

Java 8 使我们能够通过使用 default 关键字向接口添加非抽象方法实现。 此功能也称为虚拟扩展方法。

第一个例子:

interface Formula {    double calculate(int a);     default double sqrt(int a) {        return Math.sqrt(a);    }}
复制代码

Formula 接口中除了抽象方法计算接口公式还定义了默认方法 sqrt。 实现该接口的类只需要实现抽象方法calculate。 默认方法 sqrt 可以直接使用。当然你也可以直接通过接口创建对象,然后实现接口中的默认方法就可以了,我们通过代码演示一下这种方式。

Formula formula = new Formula() {    @Override    public double calculate(int a) {        return sqrt(a * 100);    }}; formula.calculate(100);     // 100.0formula.sqrt(16);           // 4.0
复制代码

formula 是作为匿名对象实现的。该代码非常容易理解,6 行代码实现了计算sqrt(a*100)。在下一节中,我们将会看到在 Java 8 中实现单个方法对象有一种更好更方便的方法。


Lambda expressions(Lambda 表达式)

首先看看在老版本的 Java 中是如何排列字符串的:

List<String> names = Arrays.asList("peter", "anna", "mike", "xenia"); Collections.sort(names, new Comparator<String>() {    @Override    public int compare(String a, String b) {        return b.compareTo(a);    }});
复制代码

只需要给静态方法 Collections.sort 传入一个 List 对象以及一个比较器来按指定顺序排列。通常做法都是创建一个匿名的比较器对象然后将其传递给 sort 方法。

在 Java 8 中你就没必要使用这种传统的匿名对象的方式了,Java 8 提供了更简洁的语法,lambda 表达式:

Collections.sort(names, (String a, String b) -> {    return b.compareTo(a);});
复制代码

可以看出,代码变得更段且更具有可读性,但是实际上还可以写得更短:

Collections.sort(names, (String a, String b) -> b.compareTo(a));
复制代码


对于函数体只有一行代码的,你可以去掉大括号{}以及 return 关键字,但是你还可以写得更短点:

names.sort((a, b) -> b.compareTo(a));
复制代码

List 类本身就有一个sort方法。并且 Java 编译器可以自动推导出参数类型,所以你可以不用再写一次类型。接下来我们看看 lambda 表达式还有什么其他用法。


发布于: 3 小时前阅读数: 9
用户头像

Bf-Bus

关注

还未添加个人签名 2020.04.11 加入

还未添加个人简介

评论

发布
暂无评论
Java 8 新特性