Java Lambda表达式教程与示例

时间:2020-12-06 19:13:10

Lambda表达式是Java 8中引入的一个新特性。一个lambda表达式是一个匿名函数,而且这个函数没有名称且不属于任何类。lambda表达式的概念最初是在LISP编程语言中引入的。

Java Lambda表达式语法

要创建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中的方法(或函数)主要有以下部分:

1、名称

2、参数列表

3、函数主体

4、返回类型

Java中的lambda表达式主要有以下部分:

Lambda表达式仅具有主体和参数列表。

1、无名称 - 函数是匿名的所以我们不关心名称

2、参数列表

3、主体 - 这是函数的主要部分

4、无返回类型 - 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 );   
    }  
}

注意:

1、正如您所看到的,我们使用lambda表达式只需较少的代码。

2、向后兼容性:您可以将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=