1、相比Java7,Java8的新特性
接口的默認方法
Java 8 容許給接口添加一個非抽象的方法實現,只須要使用default關鍵字便可,這個特徵又叫作擴展方法。express
Lambda表達式編程
函數式接口數組
方法與構造函數引用併發
Java類庫的新特性
Java 8 經過增長大量新類,擴展已有類的功能的方式來改善對併發編程、函數式編程、日期/時間相關操做以及其餘更多方面的支持。編程語言
2、Lambda表達式
lambda是十分常見的編程語言結構,在函數式編程語言(例如Lisp、Haskell)中使用範圍極廣。ide
1.lambda表達式的定義
lambda表達式其實就是沒有名稱的函數,在Java中能夠把它當成一個值。Java不容許脫離類的概念運行方法,因此lambda表達式是在某個類中定義的匿名方法(開發者可能不知道具體是哪一個類)。函數式編程
2.lambda表達式語法函數
一般以(argument) -> {body}這樣的格式書寫,argument是參數,body是表達式主體,其中參數類型能夠指定,也能夠省略,省略的話,編譯器能夠本身推斷出來類型。.net
(arg1,arg2...) -> {body} //省略參數類型
(Type1 arg1,Type2 arg2...)->{body} //指定參數類型
參數能夠是零個或多個,多個時在括號中,用逗號分隔線程
() -> {body} //零個參數時,用一個空的圓括號表示參數
(arg1) -> {body} 或者 arg1→{body} //一個參數
(arg1,arg2) -> {body} //多個參數
body表達式主體能夠是零條或多條語句,包含在花括號中,body表達式主體只有一條語句時,花括號能夠省略
3、函數式接口(FunctionalInterface)
函數式接口是Java 8爲支持Lambda表達式新發明的。lambda表達式依託於函數接口。
它的定義:一個接口,若是隻有一個顯式聲明的抽象方法,那麼它就是一個函數接口。通常用@FunctionalInterface標註出來(也能夠不標)。
@FunctionalInterface
public interface Lambda4Function {
public int add(int x ,int y);
}
4、Lambda4Function接口的使用
public class Lambda4FunctionInterfaceTest {
public static void main(String[] args){
//new一個匿名類對象
Lambda4Function lf1 = new Lambda4Function(){
public int add(int x,int y ){
return x+y;
}
};
int sum1 = lf1.add(3,4);
System.out.println("舊方式求3+4="+sum1);
//lambda表達式方式,指定參數類型
Lambda4Function lf2 = (int x,int y)->{return x+y;};
int sum2 = lf2.add(5,6);
System.out.println("lambda方式,指定參數類型,求5+6="+sum2);
//lambda表達式方式,不指定參數類型
Lambda4Function lf3 = (x, y)->{return x+y;};
int sum3 = lf3.add(7,8);
System.out.println("lambda方式,不指定參數類型,求7+8="+sum3);
}
}
5、Runnable和Comparator接口的使用
1.Runnale接口,,新建線程
public class Lambda4Runnable {
public static void main(String[] args){
Runnable oldRunnable = new Runnable() {
@Override
public void run() {
System.out.println(Thread.currentThread().getName() + ": Old Runnable");
}
};
Runnable newRunnable = () -> {
System.out.println(Thread.currentThread().getName() + ": New Lambda Runnable");
};
new Thread(oldRunnable).start();
new Thread(newRunnable).start();
}
}
2.Comparator接口,String數組排序
public class LambdaStudy {
public static void main(String[] args){
String[] oldWay = "Improving code with Lambda expressions in Java 8".split(" ");
//舊方式實現
Arrays.sort(oldWay, new Comparator<String>() {
@Override
public int compare(String s1, String s2) {
return s1.toLowerCase().compareTo(s2.toLowerCase());
}
});
System.out.println(String.join(",",oldWay));
//lambda表達式實現 String[] newWay = "Improving code with Lambda expressions in Java 8".split(" "); Arrays.sort(newWay,(s1, s2) -> { return s1.toLowerCase().compareTo(s2.toLowerCase()); }); System.out.println(String.join(",",newWay)); } } 6、lambda表達式與集合類 public class Lambda4List { public static void main(String[] args){ List<String> ls = new ArrayList<String>(); ls.add("到餐"); ls.add("外賣"); ls.add("貓眼"); //舊的方式遍歷 for(String st: ls){ System.out.println(st); } System.out.println("---------分隔符---------"); //lambda方式 ls.forEach(s -> {System.out.println(s);}); } }