Java Lambda 表达式怎么用?

文章导读
Previous Quiz Next Java Lambda 表达式 Lambda 表达式 在 Java 8 中引入,被誉为 Java 8 的最大特性。Lambda 表达式促进了函数式编程,并大大简化了开发工作。Lambda 表达式基于函数式接口的原则工作。函数式接口是一个
📋 目录
  1. Java Lambda 表达式
  2. Lambda 表达式语法
  3. Java Lambda 表达式的特性
  4. Java Lambda 表达式示例
  5. Java Lambda 表达式的作用域
  6. 在 Lambda 表达式中使用常量
  7. 在集合中使用 Lambda 表达式
A A

Java - Lambda 表达式



Previous
Quiz
Next

Java Lambda 表达式

Lambda 表达式 在 Java 8 中引入,被誉为 Java 8 的最大特性。Lambda 表达式促进了函数式编程,并大大简化了开发工作。Lambda 表达式基于函数式接口的原则工作。函数式接口是一个只有一个方法需要实现接口。Lambda 表达式为函数式接口的方法提供了实现。

Lambda 表达式 大大简化了函数式编程,使代码更易读,且无需任何样板代码。Lambda 表达式可以推断参数的类型,并且无需 return 关键字即可返回值。对于只有一个语句的简单方法,甚至可以省略大括号。

Lambda 表达式语法

Lambda 表达式的语法如下所示。

parameter -> expression body

Java Lambda 表达式的特性

以下是 Lambda 表达式的关键特性。

  • 可选的类型声明 − 无需声明参数的类型。编译器可以从参数的值中推断类型。

  • 参数周围的可选括号 − 无需为单个参数使用括号。对于多个参数,需要使用括号。

  • 可选的大括号 − 如果表达式体只包含一个语句,则无需使用大括号。

  • 可选的 return 关键字 − 如果表达式体只有一个需要返回值的表达式,编译器会自动返回该值。要表示表达式返回值的,必须使用大括号。

Java Lambda 表达式示例

在这个示例中,我们有一个函数式接口 MathOperation,它包含一个 operate 方法,该方法可以接受两个 int 参数,执行运算并将结果作为 int 返回。使用 lambda 表达式,我们为 MathOperationoperate 方法创建了四种不同的实现,用于对两个整数进行加法、减法、乘法和除法运算,并获取相应的结果。然后我们还有另一个函数式接口 GreetingService,它包含一个 sayMessage 方法,我们用它来向控制台打印消息。

package com.;

public class JavaTester {

   public static void main(String args[]) {
      JavaTester tester = new JavaTester();
		
      //with type declaration
      MathOperation addition = (int a, int b) -> a + b;
		
      //with out type declaration
      MathOperation subtraction = (a, b) -> a - b;
		
      //with return statement along with curly braces
      MathOperation multiplication = (int a, int b) -> { return a * b; };
		
      //without return statement and without curly braces
      MathOperation division = (int a, int b) -> a / b;
		
      System.out.println("10 + 5 = " + tester.operate(10, 5, addition));
      System.out.println("10 - 5 = " + tester.operate(10, 5, subtraction));
      System.out.println("10 x 5 = " + tester.operate(10, 5, multiplication));
      System.out.println("10 / 5 = " + tester.operate(10, 5, division));
		
      //without parenthesis
      GreetingService greetService1 = message -> System.out.println("Hello " + message);
		
      //with parenthesis
      GreetingService greetService2 = (message) -> System.out.println("Hello " + message);
		
      greetService1.sayMessage("Mahesh");
      greetService2.sayMessage("Suresh");
   }
	
   interface MathOperation {
      int operation(int a, int b);
   }
	
   interface GreetingService {
      void sayMessage(String message);
   }
	
   private int operate(int a, int b, MathOperation mathOperation) {
      return mathOperation.operation(a, b);
   }
}

输出

让我们编译并运行上述程序,这将产生以下结果 −

10 + 5 = 15
10 - 5 = 5
10 x 5 = 50
10 / 5 = 2
Hello Mahesh
Hello Suresh

以上示例中有以下重要要点需要注意。

  • Lambda 表达式主要用于定义函数式接口的内联实现,即仅包含单个方法的接口。在上述示例中,我们使用了各种类型的 lambda 表达式来定义 MathOperation 接口的 operation 方法。然后我们定义了 GreetingServicesayMessage 实现。

  • Lambda 表达式消除了匿名类的需求,为 Java 提供了非常简单却强大的函数式编程能力。

Java Lambda 表达式的作用域

使用 lambda 表达式,你可以引用任何 final 变量或有效 final 变量(仅赋值一次的变量)。如果变量第二次被赋值,lambda 表达式会抛出编译错误。

在 Lambda 表达式中使用常量

在这个示例中,我们有一个函数式接口 GreetingService,它包含一个 sayMessage 方法,我们用它来向控制台打印消息。现在在 JavaTester 类中,我们有一个 final 类字段 salutation,其值为 "Hello! "。现在在 lambda 表达式中,我们可以无错误地使用这个 final 字段。

在 Lambda 表达式中使用常量的示例

public class JavaTester {

   final static String salutation = "Hello! ";
   
   public static void main(String args[]) {
      GreetingService greetService1 = message -> System.out.println(salutation + message);
      greetService1.sayMessage("Mahesh");
   }
	
   interface GreetingService {
      void sayMessage(String message);
   }
}

输出

让我们编译并运行上述程序,这将产生以下结果 −

Hello! Mahesh

在集合中使用 Lambda 表达式

从 Java 8 开始,几乎所有 collection 都得到了增强,可以接受 lambda expression 来对它们执行操作。例如,遍历列表、过滤列表、排序列表等。在这个示例中,我们展示如何使用 lambda expressions 遍历字符串列表并打印所有元素,以及如何仅打印列表中的偶数。

在集合中使用 Lambda 表达式的示例

package com.;

import java.util.ArrayList;
import java.util.List;

public class JavaTester {

   public static void main(String args[]) {
    
	   // 准备一个字符串列表
	   List<String> list = new ArrayList<>();
	   list.add("java");
	   list.add("html");
	   list.add("python");
      
	   // 使用 lambda 表达式打印列表
	   // 这里我们将 lambda 表达式传递给 list 对象的 forEach 方法
	   list.forEach(i -> System.out.println(i));
	   
	   List<Integer> numbers = new ArrayList<>();
	   numbers.add(1);
	   numbers.add(2);
	   numbers.add(3);
	   numbers.add(4);
	   numbers.add(5);
	   numbers.add(6);
	   numbers.add(7);
	   numbers.add(8);
	   System.out.println(numbers);
	   
	   // 使用 lambda 表达式过滤列表
	   // 这里我们将 lambda 表达式传递给 list 对象的 removeIf 方法
	   // 检查数字是否能被 2 整除	  
	   numbers.removeIf( n -> n%2 != 0);
	   System.out.println(numbers);
   }
}

输出

让我们编译并运行上述程序,这将产生以下结果 −

java
html
python
[1, 2, 3, 4, 5, 6, 7, 8]
[2, 4, 6, 8]