- 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 關鍵字返回數據
②沒有{}包裹的只能寫一個語句,而有{}包裹的可以寫任意多條語句。