原文: https://beginnersbook.com/2017/10/java-lambda-expressions-tutorial-with-examples/
Lambda 表达式是 Java 8 中引入的一个新特性。λ 表达式是一个匿名函数。一个没有名称且不属于任何类的函数。 lambda 表达式的概念最初是在 LISP 编程语言中引入的。
要创建 lambda 表达式,我们在 lambda 运算符
->
的左侧指定输入参数(如果有的话),并将表达式或语句块放在 lambda 运算符的右侧。例如,lambda 表达式
(x, y) -> x + y
指定 lambda 表达式接受两个参数
x
和
y
并返回这些参数的总和。
//Syntax of lambda expression
(parameter_list) -> {function_body}
Java 中的方法(或函数)具有以下主要部分:
Java 中的 lambda 表达式具有以下主要部分: Lambda 表达式 仅具有主体和参数列表 。
要使用 lambda 表达式,您需要创建自己的函数式接口或使用 Java 提供的预定义函数式接口。只有单个抽象方法的接口称为函数式接口(或单抽象方法接口),例如:
Runnable
,
callable,ActionListener
等。
使用函数式接口:
Java 8 之前:我们创建匿名内部类。 Java 8 之后:您可以使用 lambda 表达式而不是匿名内部类。
**不使用 Lambda 表达式:**在 java 8 之前,我们使用匿名内部类来实现函数式接口的唯一抽象方法。
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 表达式,而不是创建匿名内部类:
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);
正如您所看到的,我们使用较少的代码与 lambda 表达式。
向后兼容性:您可以将 lambda 表达式与旧代码一起使用。 Lambdas 是向后兼容的,因此当您将项目迁移到 Java 8 时,可以在现有 API 中使用它们。
让我们看几个 Lambda 表达式的例子。
@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());
Hello
@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));
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"));
Result: Hello World
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