java8新語法


Lambda表達式和函數接口(Functional Interface)

 1     // lambda expressions 
 2     public static void DemoLambda() {
 3         // 不使用lambda表達式
 4         Runnable runnable1 = new Runnable() {
 5             @Override
 6             public void run() {
 7                 System.out.println("do not use lambda expressions!!");
 8             }
 9         };
10         runnable1.run();
11         
12         
13         // 使用lambda表達式
14         Runnable runnable2 = () -> {
15             System.out.println("use lambda expressions!!");
16         };
17         runnable2.run();
18     }

 可以看到使用了lambda表達式后代碼簡潔了很多。lambda表達式實際就是匿名方法,他由兩部分構成:參數和方法體——方法名和返回類型(通過函數體來推斷)給省略了。例子中的參數為空,所以給了一個“()”代表參數為空;“->”代表使用了lambda表達式(c#中使用=>);“{}”中的內容為方法體,如果只有一句代碼可以省略掉“{}”,和for循環一樣。

另一個是函數接口。表示只有一個方法的接口就叫函數接口,可以使用注解 @FunctionalInterface 來標識這個接口是函數接口,但不是必須的。比如 Runnable 這個接口就是函數接口(只有一個方法),所以lambda表達式所實現的方法就是run方法。

 

 

方法引用

方法引用就是lambda的一種簡化寫法,相當於把方法當成一個變量賦值給另一個方法,這個方法接受的參數是一個函數接口,他有3中實現:

1. 方法是static的:類名::方法名,例如:Math::sin

2. 方法不是static的:對象::方法名,例如:StringBuilder sb = new StringBuilder(); sb::append

3. 構造方法:類名::new

 1 public class MethodDemo {
 2     // 這個方法接受一個函數式接口
 3     public static void HasFunctionalInterface(FunctionalInterfaceDemo fid) {
 4         fid.doSoming("運行在:");
 5     }
 6     
 7     // 3中實現方法
 8     public static void main(String[] args) {
 9         // 第一種實現:new一個匿名的對象
10         HasFunctionalInterface(new FunctionalInterfaceDemo() {
11             @Override
12             public void doSoming(String str) {
13                 System.out.println(str + "以前的實現");
14             }
15         });
16         
17         // 第二種實現:使用lambda表達式
18         // e 是參數,System.out.println("運行在:lambda表達式"); 是方法體
19         HasFunctionalInterface(e -> { System.out.println("運行在:lambda表達式"); });
20         
21         // 第三種實現:使用方法引用
22         FunctionalInterfaceImplements fif = new FunctionalInterfaceImplements();
23         HasFunctionalInterface(fif::doSoming);
24     }
25 }
26 
27 
28 // 實現了函數式接口
29 class FunctionalInterfaceImplements implements FunctionalInterfaceDemo {
30     public void doSoming(String str) {
31         System.out.println(str + "方法的引用");
32     }
33 }
34 
35 
36 // 一個函數式接口
37 @FunctionalInterface
38 interface FunctionalInterfaceDemo {
39     void doSoming(String str);
40 }

 

 java8還更新了很多替他的特性,這里只是粗略描述一個新的語法


免責聲明!

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



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