企业🤖AI智能体构建引擎,智能编排和调试,一键部署,支持私有化部署方案 广告
# 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/)