Java 教程

Java 控制语句

面向对象编程

Java 内置类

Java 文件处理

Java 错误与异常

Java 多线程

Java 同步

Java 网络编程

Java 集合

Java 接口

Java 数据结构

Java 集合算法

高级 Java

Java 其他

Java API 与框架

Java 类引用

Java 有用资源

Java – Lambda 表达式



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 表达式,我们创建了 MathOperation operate 方法的四个不同实现,用于添加、减去、乘以和除以两个整数并获得相应的结果。然后我们有另一个函数式接口 GreetingService,它有一个 sayMessage 方法,我们用它来打印消息到控制台。

package com.tutorialspoint;

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 方法。然后我们定义了 GreetingService 的 sayMessage 的实现。

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

Java Lambda 表达式的范围

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

在 Lambda 表达式中使用常量

在这个例子中,我们有一个函数式接口 GreetingService,它有一个 sayMessage 方法,我们用它来打印消息到控制台。现在在 Java Tester 类中,我们有一个 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 开始,几乎所有集合都增强了对lambda表达式的支持,可以使用lambda表达式来执行集合操作。例如,迭代列表、过滤列表、排序列表等等。本例展示了如何使用lambda表达式迭代字符串列表并打印所有元素,以及如何打印列表中所有偶数。

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

package com.tutorialspoint;

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

public class JavaTester {

   public static void main(String args[]) {
    
	   // prepare a list of strings
	   List<String> list = new ArrayList<>();
	   list.add("java");
	   list.add("html");
	   list.add("python");
      
	   // print the list using a lambda expression
	   // here we're passing a lambda expression to forEach 
	   // method of list object
	   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);
	   
	   // filter the list using a lambda expression
	   // here we're passing a lambda expression to removeIf 
	   // method of list object where we can checking 
	   // if number is divisible by 2 or not	  
	   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]
广告