Java Lambda表達式教程與示例

Lambda表達式是Java 8中引入的一個新特性。一個lambda表達式是一個匿名函數,並且這個函數沒有名稱且不屬於任何類。lambda表達式的概念最初是在LISP編程語言中引入的。java

Java Lambda表達式語法express

要建立lambda表達式,咱們須要在lambda運算符(->)的左側指定輸入參數(若是有的話),並將表達式或語句塊放在lambda運算符的右側。例如,lambda表達式(x,y)->x + y 表示lambda表達式採用兩個參數x和y並返回兩個參數的總和。編程

1
2
//Syntax of lambda expression
(parameter_list) -> {function_body}

Lambda表達式 vs Java中的方法編程語言

Java中的方法(或函數)主要有如下部分:函數

一、名稱post

二、參數列表spa

三、函數主體code

四、返回類型orm

Java中的lambda表達式主要有如下部分:接口

Lambda表達式僅具備主體和參數列表。

一、無名稱 - 函數是匿名的因此咱們不關心名稱

二、參數列表

三、主體 - 這是函數的主要部分

四、無返回類型 - java 8編譯器可以經過檢查代碼來推斷返回類型,因此使用者無需明確指定

在Java中使用Lambda表達式的位置

要使用lambda表達式,您須要建立本身的功能接口或使用Java提供的預約義功能接口。功能性接口(或單一抽象方法接口)是指帶有單一抽象方法的接口,例如:可運行接口、可調用接口、動做監聽者等等。

使用函數接口:

Java 8以前:咱們建立匿名內部類。

Java 8以後:您能夠使用lambda表達式代替匿名內部類。

Java Lambda表達式實例

不使用Lambda表達式:在Java 8以前,咱們使用匿名內部類來實現功能接口的惟一抽象方法。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
import  java.awt.*;  
import  java.awt.event.*;  
public  class  ButtonListenerOldWay {  
     public  static  void  main(String[] args) {  
        Frame frame= new  Frame( "ActionListener Before Java8" );  
     
        Button b= new  Button( "Click Here" );  
        b.setBounds( 50 , 100 , 80 , 50 );  
   
        b.addActionListener( new  ActionListener(){  
           public  void  actionPerformed(ActionEvent e){  
          System.out.println( "Hello World!" ); 
           }  
        });  
        frame.add(b);
     
        frame.setSize( 200 , 200 );  
        frame.setLayout( null );  
        frame.setVisible( true );   
     }  
}

   Lambda使用表達式方式:咱們能夠像這樣建立一個lambda表達式,而不是建立匿名內部類:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import  java.awt.*;  
public  class  ButtonListenerNewWay {  
    public  static  void  main(String[] args) {  
       Frame frame= new  Frame( "ActionListener java8" );  
      
       Button b= new  Button( "Click Here" );  
       b.setBounds( 50 , 100 , 80 , 50 ); 
   
       b.addActionListener(e -> System.out.println( "Hello World!" )); 
       frame.add(b);
   
       frame.setSize( 200 , 200 );  
       frame.setLayout( null );  
       frame.setVisible( true );   
    }  
}

注意:

一、正如您所看到的,咱們使用lambda表達式只需較少的代碼。

二、向後兼容性:您能夠將lambda表達式與舊代碼一塊兒使用,Lambdas是向後兼容的,所以當您將項目遷移到Java 8時,能夠在現有API中使用它們。

讓咱們看幾個Lambda表達式的例子。

示例1:沒有參數的Java Lambda表達式     

1
2
3
4
5
6
7
8
9
10
11
12
13
14
@FunctionalInterface
interface  MyFunctionalInterface {
//A method with no parameter
     public  String sayHello();
}
public  class  Example {
    public  static  void  main(String args[]) {
         // lambda expression
     MyFunctionalInterface msg = () -> {
     return  "Hello" ;
     };
         System.out.println(msg.sayHello());
     }
}

輸出:

1
Hello

示例2:具備單個參數的Java Lambda表達式

1
2
3
4
5
6
7
8
9
10
11
12
@FunctionalInterface
interface  MyFunctionalInterface {
//A method with single parameter
     public  int  incrementByFive( int  a);
}
public  class  Example {
    public  static  void  main(String args[]) {
         // lambda expression with single parameter num
     MyFunctionalInterface f = (num) -> num+ 5 ;
         System.out.println(f.incrementByFive( 22 ));
     }
}

輸出:

1
 

示例3:具備多個參數的Java Lambda表達式

1
2
3
4
5
6
7
8
9
10
interface  StringConcat {
     public  String sconcat(String a, String b);
}
public  class  Example {
    public  static  void  main(String args[]) {
         // lambda expression with multiple arguments
     StringConcat s = (str1, str2) -> str1 + str2;
         System.out.println( "Result: " +s.sconcat( "Hello " "World" ));
     }
}

輸出:

1
Result:Hello World

示例4:使用foreach循環迭代集合

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import  java.util.*;  
public  class  Example{  
     public  static  void  main(String[] args) {       
        List<String> list= new  ArrayList<String>();  
        list.add( "Rick" );         
        list.add( "Negan" );       
        list.add( "Daryl" );         
        list.add( "Glenn" );         
        list.add( "Carl" );                
        list.forEach(          
            // lambda expression        
            (names)->System.out.println(names)         
        );     
     }  
}

咱們能夠使用lambda表達式迭代Maps和其餘集合類,請參閱本指南:https://www.koofun.com/pro/kfpostsdetail?kfpostsid=36&cid=

相關文章
相關標籤/搜索