Java 8容许咱们给接口添加一个非抽象的方法实现,只须要使用 default
关键字便可,这个特征又叫作扩展方法,
示例以下:java
interface Formula{ double Formula(int a); default double sqrt(int a) { return Math.sqrt(a); } }
Formula接口在拥有calculate方法以外同时还定义了sqrt方法,实现了Formula接口的子类只须要实现一个calculate方法,默认方法sqrt将在子类上能够直接使用。api
Formula formula = new Formula() { @Override public double calculate(int a) { return sqrt(a * 100); } }; formula.calculate(100); // 100.0 formula.sqrt(16); // 4.0
Lambda 表达式,也可称为闭包,容许把函数做为一个参数,使代码更简洁。
Lambda表达式使用具有条件:闭包
传统案例:ide
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); }); // 对于函数体只有一行代码的,能够去掉大括号{}以及return关键字 Collections.sort(names, (String a, String b) -> b.compareTo(a)); //Java编译器能够自动推导出参数类型,因此你能够不用再写一次类型 Collections.sort(names, (a, b) -> b.compareTo(a)); //如果没有参数 () ->{函数体} ()->单行函数体 //如果单个参数 a ->{函数体} a->单行函数体