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->單行函數體