一篇文章快速搞懂Java Lambda表達式

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);
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章