Java8中的Lambda表达式Lambda表达式基本上表示函数式接口的实例(具有单个抽象方法的接口称为函数接口)。一个例子是(java.lang.Runnable). lambda表达式实现唯一的抽象函数

关于函数式接口参考这篇文章:Java8中的函数式接口

lambda表达式是在java8中添加的,并提供以下功能。

// Java program to demonstrate lambda expressions 
// to implement a user defined functional interface. 
  
// A sample functional interface (An interface with 
// single abstract method 
interface FuncInterface 
{ 
    // An abstract function 
    void abstractFun(int x); 
  
    // A non-abstract (or default) function 
    default void normalFun() 
    { 
       System.out.println("Hello"); 
    } 
} 
  
class Test 
{ 
    public static void main(String args[]) 
    { 
        // lambda expression to implement above 
        // functional interface. This interface 
        // by default implements abstractFun() 
        FuncInterface fobj = (int x)->System.out.println(2*x); 
  
        // This calls above lambda expression and prints 10. 
        fobj.abstractFun(5); 
    } 
} 

输出:

10

Java8中的Lambda表达式语法:

lambda operator -> body

其中lambda操作符可以是:

零参数:

() -> System.out.println("Zero parameter lambda");

一个参数:

(p) -> System.out.println("One parameter: " + p);

如果可以从上下文推断出变量的类型,则不必使用括号

多个参数:

(p1, p2) -> System.out.println("Multiple parameters: " + p1 + ", " + p2);

请注意:Lambda表达式就像函数一样,它们接受参数就像函数一样。

// A Java program to demonstrate simple lambda expressions 
import java.util.ArrayList; 
class Test 
{ 
    public static void main(String args[]) 
    { 
        // Creating an ArrayList with elements 
        // {1, 2, 3, 4} 
        ArrayList<Integer> arrL = new ArrayList<Integer>(); 
        arrL.add(1); 
        arrL.add(2); 
        arrL.add(3); 
        arrL.add(4); 
  
        // Using lambda expression to print all elements 
        // of arrL 
        arrL.forEach(n -> System.out.println(n)); 
  
        // Using lambda expression to print even elements 
        // of arrL 
        arrL.forEach(n -> { if (n%2 == 0) System.out.println(n); }); 
    } 
} 

输出:

1
2
3
4
2
4

注意lambda表达式只能用于实现函数接口。在上面的示例中,lambda表达式还实现了Consumer函数接口。

一个Java程序来演示两个参数的lambda表达式的工作。

// Java program to demonstrate working of lambda expressions 
public class Test 
{ 
    // operation is implemented using lambda expressions 
    interface FuncInter1 
    { 
        int operation(int a, int b); 
    } 
  
    // sayMessage() is implemented using lambda expressions 
    // above 
    interface FuncInter2 
    { 
        void sayMessage(String message); 
    } 
  
    // Performs FuncInter1's operation on 'a' and 'b' 
    private int operate(int a, int b, FuncInter1 fobj) 
    { 
        return fobj.operation(a, b); 
    } 
  
    public static void main(String args[]) 
    { 
        // lambda expression for addition for two parameters 
        // data type for x and y is optional. 
        // This expression implements 'FuncInter1' interface 
        FuncInter1 add = (int x, int y) -> x + y; 
  
        // lambda expression multiplication for two parameters 
        // This expression also implements 'FuncInter1' interface 
        FuncInter1 multiply = (int x, int y) -> x * y; 
  
        // Creating an object of Test to call operate using 
        // different implementations using lambda Expressions 
        Test tobj = new Test(); 
  
        // Add two numbers using lambda expression 
        System.out.println("Addition is " + 
                          tobj.operate(6, 3, add)); 
  
        // Multiply two numbers using lambda expression 
        System.out.println("Multiplication is " + 
                          tobj.operate(6, 3, multiply)); 
  
        // lambda expression for single parameter 
        // This expression implements 'FuncInter2' interface 
        FuncInter2 fobj = message ->System.out.println("Hello "
                                                 + message); 
        fobj.sayMessage("Geek"); 
    } 
} 

输出:

Addition is 9
Multiplication is 18
Hello Geek

要点:

  • lambda表达式的主体可以包含零个、一个或多个语句。
  • 当存在单个语句时,花括号不是必需的,并且匿名函数的返回类型与主体表达式的返回类型相同。
  • 当有多个语句时,这些语句必须括在方括号(代码块)中,并且匿名函数的返回类型与代码块中返回的值的类型相同,如果不返回任何值,则返回void