Java 8 Lambda表達式的使用


  • lambda表達式允許你通過表達式來代替功能接口。lambda表達式就和方法一樣,它提供了一個正常的參數列表和一個使用這些參數的主體(body,可以是一個表達式或一個代碼塊)。
  • Lambda表達式還增強了集合庫。 Java SE 8添加了2個對集合數據進行批量操作的包: java.util.function 包以及java.util.stream 包。

  實現一個接口(功能接口)中的唯一方法(老辦法):

    1、接口中的方法無返回值:

 1 package JDK8Test;
 2 interface RunTask
 3 {
 4     void run();
 5 }
 6 public class Main 
 7 {
 8 
 9     public static void main(String[] args) 
10     {
11         RunTask r=new RunTask() 
12         {
13             public void run()
14             {
15                 System.out.println("我是線程要執行的任務");
16             }
17         };
18         r.run();
19     }
20 }

  首先要創建一個類,這個類實現了這個功能接口,然后在類中對方法進行實現。然后實例化一個這個類的對象r,由對象調用run()方法。(此處使用匿名內部類)

  Lambda表達式形式:

  Java提供了一個新的操作符"->" 這個操作符之前有一個括號,括號里面就是接口中的那個唯一的方法的參數列表,操作符后面就是我們以前實現接口中的方法中的語句,具體就以上面的代碼為參照。

  使用前提:

  ①接口中就只有一個抽象方法,也就是我們剛剛定義的接口,里面就只能有一個抽象方法。

  2、接口中的方法有返回值:

 1 package JDK8Test;
 2 interface RunTask
 3 {
 4     String run();
 5 }
 6 public class Main 
 7 {
 8     public static void main(String[] args) 
 9     {
10         RunTask r=()->System.currentTimeMillis()%2==0?"當前的毫秒值能被2整除":"不能被2整除";
11         String value=r.run();
12         System.out.println(value);
13     }
14 }

  也就是說,如果返回值是一個String類型的,則”->”后面跟的就必須是一個字符串。調用run()方法時,返回的就是這個字符串。

  3、接口中的方法有參數:

 1 package JDK8Test;
 2 interface RunTask
 3 {
 4     String run(String name);
 5 }
 6 public class Main 
 7 {
 8     public static void main(String[] args) 
 9     {
10         RunTask r=(who)->who+"在調用我";
11         String value=r.run("Peter");
12         System.out.println(value);
13     }
14 }        //輸出    Peter在調用我

  操作符"->“前面的括號中寫了一個參數的變量名,然后你可以看到這個變量在后面的語句中我們就可以使用了!方法中的參數接收一個String類型的,所以who這個變量就必須是字符串類型的,所以who前面可以加一個String。

  4、實現比較器接口:

 1 package JDK8Test;
 2 import java.util.*;
 3 
 4 public class Main 
 5 {
 6     public static void main(String[] args) 
 7     {
 8         ArrayList<Integer> list=new ArrayList<Integer>();
 9         list.add(5);
10         list.add(8);
11         list.add(6);
12         System.out.println(list);
13         Collections.sort(list, (Integer a,Integer b)->a-b);
14         System.out.println(list);
15     }
16 }        
17 //[5, 8, 6]
18 //[5, 6, 8]

  可以看得到”->" 操作符前面是接口中的方法的參數列表,后面是實現接口的方法中的表達式。

  5、實現Consumer接口,遍歷集合(老方法):

 1 package JDK8Test;
 2 import java.util.ArrayList;
 3 import java.util.function.Consumer;
 4 
 5 public class Main 
 6 {
 7     public static void main(String[] args) 
 8     {
 9         ArrayList<Integer> list=new ArrayList<Integer>();
10         list.add(5);
11         list.add(8);
12         list.add(6);
13         Two two=new Two();
14         list.forEach(two);
15     }
16 }    
17 class Two implements Consumer<Integer>
18 {
19     public void accept(Integer t)
20     {
21         System.out.println("遍歷中"+t);
22     }
23 }
24 /*輸出:
25  遍歷中5
26 遍歷中8
27 遍歷中6 
28 */

  Lambda表達式方法:

  

 1 package JDK8Test;
 2 import java.util.ArrayList;
 3 import java.util.function.Consumer;
 4 
 5 public class Main 
 6 {
 7     public static void main(String[] args) 
 8     {
 9         ArrayList<Integer> list=new ArrayList<Integer>();
10         list.add(5);
11         list.add(8);
12         list.add(6);
13         Consumer<Integer> r=(Integer t)->System.out.println("遍歷中"+t);
14         list.forEach(r);
15     }
16 }    
17 /*輸出:
18 遍歷中5
19 遍歷中8
20 遍歷中6 
21 */

  5、”->”后面有{}包裹:

  

 1 package JDK8Test;
 2 import java.util.ArrayList;
 3 import java.util.Collections;
 4 import java.util.function.Consumer;
 5 
 6 public class Main 
 7 {
 8     public static void main(String[] args) 
 9     {
10         ArrayList<Integer> list=new ArrayList<Integer>();
11         list.add(5);
12         list.add(8);
13         list.add(6);
14         System.out.println(list);
15         Collections.sort(list, (Integer a,Integer b)->{return a-b;});
16         System.out.println(list);
17     }
18 }    
19 /*輸出:
20 [5, 8, 6]
21 [5, 6, 8]
22 */

  沒有{}和有{}的區別是:
  ①沒有{}包裹的不用寫return 關鍵字,有{}包裹的,如果有返回值,必須使用return 關鍵字返回數據
  ②沒有{}包裹的只能寫一個語句,而有{}包裹的可以寫任意多條語句。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM