Java Lambda表達式是Java8 引入的一個新的特性,它類似於JavaScript中的閉包,主要目的是讓我們的代碼變的更加簡潔緊湊。
1. Lambda 基本語法
Lambda 的基本語法格式如下兩種形式:
(parameters) -> expression
或
(parameters) ->{ statements; }
其中,包括幾項重要特徵:
- 編譯器可以統一識別參數,不需要指定類型 例如
(a) - > System.out.println(a)
- 當只有一個參數時,不用寫括號 例如
a ->System.out.println(a)
- 參數可以爲空
() ->System.out.println("hello world")
- 參數指定類型時,必須有括號
(String a) -> System.out.println("hello world")
常見實例
// 1. 不需要參數,返回值爲 5
() -> 5
// 2. 接收一個參數(數字類型),返回其2倍的值
x -> 2 * x
// 3. 接受2個參數(數字),並返回他們的差值
(x, y) -> x – y
// 4. 接收2個int型整數,返回他們的和
(int x, int y) -> x + y
// 5. 接受一個 string 對象,並在控制檯打印,不返回任何值(看起來像是返回void)
(String s) -> System.out.print(s)
2. Lambda 的作用
Lambda 主要是以函數式接口爲基礎,來定義內執行的方法的接口。免去了使用匿名方法的麻煩,給Java賦予了強大的函數化編程能力
舉例
以前我們新建一個Thread
,Runnable
接口是我們操作多線程時的一個常用的接口,只包含void run()
方法。在以前,我們如果新建一個線程,需要如下寫法:
new Thread(new Runnable() {
@Override
public void run() {
System.out.println("Hello world;");
}
}).start();
現在,有個Lambda表達式,就可以非常簡介的寫出上述代碼:
new Thread(() -> System.out.println("Hello world")).start();
也可以寫成
Runnable r = () -> System.out.println("Hello World");
new Thread(r).start();
還有一個我們常用的比較器
Integer a[] = {8,3,7,1,7,4,2,7};
Arrays.sort(a, new Comparator<Integer>() {
@Override
public int compare(Integer integer, Integer t1) {
return integer - t1;
}
});
現在可以寫成
Integer a[] = {8,3,7,1,7,4,2,7};
Arrays.sort(a, (a1 , a2)-> a1-a2);
3. Stream 對象
Stream
對象也是java8新添加的一個新加入的API,主要用於對Collection
對象功能的增強,對各種集合對象進行各種非常遍歷、高效地聚合或大批量操作。Stream API通過藉助Lambda表達式,可以極大的提高編程效率喝程序可讀性。
包括的主要方法:
forEach 用來迭代流中的每個元組,下面是例子:
List<String> strings = Arrays.asList("abc", "123", "bc", "efg", "abcd","", "jkl");
//逐個打印集合中的元素
strings.stream().forEach(System.out::println);
map用來映射每個元素到對應的結果
List<Integer> list = Arrays.asList(1,2,3,4,5);
//把list中的所有元素加2
List<Integer> slist = list.stream().map(i->i+2).collect(Collectors.toList());
filter用於通過設置好的條件對集合中的元素進行過濾
List<String>strings = Arrays.asList("abc", "12313123", "bc", "efg", "abcd","", "jkl");
// 獲取長度大於3的字符串的數量
long count = strings.stream().filter(string -> string.length() > 3).count();
limit 用於獲取指定數量的流
List<String> strings = Arrays.asList("abc", "123", "bc", "efg", "abcd","", "jkl");
//打印集合中的3條元素
strings.stream()。limit(3).forEach(System.out::println);
sorted 方法用於對流進行排序。
List<String> strings = Arrays.asList("abc", "12313123", "bc", "efg", "abcd","", "jkl");
//正序
strings.stream().sorted().forEach(System.out::println);
//倒序 strings.stream().sorted(Comparator.reverseOrder()).forEach(System.out::println);