# Java Lambda 表达式教程

> 原文： [https://beginnersbook.com/2017/10/java-lambda-expressions-tutorial-with-examples/](https://beginnersbook.com/2017/10/java-lambda-expressions-tutorial-with-examples/)

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

## Java Lambda 表达式语法

要创建 lambda 表达式，我们在 lambda 运算符`->`的左侧指定输入参数（如果有的话），并将表达式或语句块放在 lambda 运算符的右侧。例如，lambda 表达式`(x, y) -> x + y`指定 lambda 表达式接受两个参数`x`和`y`并返回这些参数的总和。

```java
//Syntax of lambda expression
(parameter_list) -> {function_body}
```

## Lambda 表达式与 Java 中的方法

Java 中的方法（或函数）具有以下主要部分：

1.  名称
2.  参数列表
3.  正文
4.  返回类型。

Java 中的 lambda 表达式具有以下主要部分：
Lambda 表达式**仅具有主体和参数列表**。

1.  **没有**名称 - 函数是匿名的，所以我们不关心名称
2.  参数列表
3.  正文 - 这是函数的主要部分。
4.  **没有**返回类型 - java 8 编译器能够通过检查代码来推断返回类型。你不必明确提及它。

## 在 Java 中使用 Lambdas 的位置

要使用 lambda 表达式，您需要创建自己的函数式接口或使用 Java 提供的预定义函数式接口。只有单个抽象方法的接口称为函数式接口（或单抽象方法接口），例如：`Runnable`，`callable，ActionListener`等。

**使用函数式接口：**

Java 8 之前：我们创建匿名内部类。
Java 8 之后：您可以使用 lambda 表达式而不是匿名内部类。

## Java Lambda 表达式示例

**不使用 Lambda 表达式：**在 java 8 之前，我们使用匿名内部类来实现函数式接口的唯一抽象方法。

```java
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 表达式，而不是创建匿名内部类：

```java
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 表达式

```java
@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());
    }
}
```

输出：

```java
Hello
```

## 示例 2：具有单个参数的 Java Lambda 表达式

```java
@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));
    }
}
```

输出：

```java
27
```

## 示例 3：具有多个参数的 Java Lambda 表达式

```java
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"));
    }
}
```

输出：

```java
Result: Hello World
```

## 示例 4：使用`foreach`循环迭代集合

```java
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 和其他集合类，参考本指南：[使用 lambda 表达式迭代 Map 和 List](https://beginnersbook.com/2017/01/lambda-expression-iterating-map-and-list-in-java-8/)