Java8新特性(一)---Lambda表示式
阿新 • • 發佈:2018-11-05
Java8新特性之Lambda表示式
Lambda表示式可以簡單的理解為可傳遞的匿名函式的一中方式,它沒有名稱,但它有引數列表、函式主體、返回型別。可以讓我們程式設計更加的方便。
在Java8引入了一個新的基礎語法:就是一個“->”。該操作符稱為箭頭操作符或者Lambda操作符。
箭頭將Lambda表示式拆分為兩個部分
- 左側:Lambda表示式的引數列表
- 右側:Lambda表示式中所需執行的功能,即Lambda體
Lambda的語法格式
語法格式一:無引數,無返回值
() -> System.out.println("Hello Lambda!");
語法格式二:有一個引數,並且無返回值
(x) -> System.out.println(x)
語法格式三:若只有一個引數,小括號可以省略不寫
x -> System.out.println(x)
語法格式四:有兩個以上的引數,有返回值,並且 Lambda 體中有多條語句
Comparator<Integer> com = (x, y) -> { System.out.println("函式式介面"); return Integer.compare(x, y); };
語法格式五:若 Lambda 體中只有一條語句, return 和 大括號都可以省略不寫
Comparator<Integer> com = (x, y) -> Integer.compare(x, y);
語法格式六:Lambda 表示式的引數列表的資料型別可以省略不寫,因為JVM編譯器通過上下文推斷出,資料型別,即“型別推斷”
//即以下程式碼中的“Integer”可以省略
(Integer x, Integer y) -> Integer.compare(x, y);
接下來我將以程式碼演示,在Java8之前沒lambda表示式的樣子,以及有lambda表示式後的變化。
在Java8之前沒有Lambda表示式
public void test1(){
//最原始:首先自定義一個排序類,再作為引數傳遞給TreeSet
Comparator<String> com = new Comparator<String>(){
@Override
public int compare(String o1, String o2) {
return Integer.compare(o1.length(), o2.length());
}
};
TreeSet<String> ts = new TreeSet<>(com);
//優化1:排序類使用匿名物件
TreeSet<String> ts2 = new TreeSet<>(new Comparator<String>(){
@Override
public int compare(String o1, String o2) {
return Integer.compare(o1.length(), o2.length());
}
});
}
有lambda表示式之後
//現在的 Lambda 表示式
@Test
public void test2(){
TreeSet<String> ts2 = new TreeSet<>((x, y) -> Integer.compare(x.length(), y.length()));
}
是不是感覺非常的簡潔,也不用寫很多無用的程式碼了。其實我們關注的只是單單那一行。
Lambda表示式
舉例
用Runnable執行程式碼塊
之前
Thread t = new Thread(new Runnable() {
public void run(){
System.out.println("Hello world");
}
});
之後(用了Lambda表示式)
Thread t = new Thread(() -> System.out.println("Hello world"));
用Comparator進行排序
之前
Comparator<Apple> byWeight = new Comparator<Apple>() {
public int compare(Apple a1, Apple a2){
return a1.getWeight().compareTo(a2.getWeight());
}
};
之後(用了Lambda表示式)
Comparator<Apple> byWeight = (Apple a1, Apple a2) -> a1.getWeight().compareTo(a2.getWeight());
在第一次接觸這個lambda表示式時可能感覺會有點彆扭,但是不得不承認,程式碼看起來更清晰了!我們傳遞的只是比較蘋果的重量或者關注的真正需要執行的程式碼。
總的來說,Lambda表示式免去了使用匿名方法的麻煩,給予Java強大的函式化程式設計的能力。