Java8 使开发者能够通过使用 default
关键字向接口添加非抽象方法实现,也称为虚拟扩展方法。
第一个例子:
interface Formula{
double calculate(int a);
default double sqrt(int a) {
return Math.sqrt(a);
}
}
Formula 接口中,除了抽象方法计算接口公式,还定义了默认方法 sqrt()
,实现该接口的类只需要实现抽象方法 calculate()
。
默认方法 sqrt()
允许直接使用,也可以直接通过接口创建对象,然后实现接口中的默认方法,下面通过代码来演示一下这种方式:
public class Main {
public static void main(String[] args) {
// TODO 通过匿名内部类方式访问接口
Formula formula = new Formula() {
@Override
public double calculate(int a) {
return sqrt(a * 100);
}
};
System.out.println(formula.calculate(100)); // 100.0
System.out.println(formula.sqrt(16)); // 4.0
}
}
formula 是作为匿名对象实现的。
注: 不管是抽象类还是接口,都可以通过匿名内部类的方式访问,但不能通过抽象类或者接口直接创建对象。对于上面通过匿名内部类方式访问接口,我们可以这样理解:一个内部类实现了接口里的抽象方法,并且返回一个内部类对象,之后我们让接口的引用来指向这个对象 。
首先看看在老版本的 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()
方法。
而在 Java8 中,就没必要使用这种传统的匿名对象方式了,Java8 提供了更简洁的语法,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 编译器可以自动推导出参数类型,所以可以不用再写一次类型。
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有