Lambda表达式解析

1.为什么要有Lambda表达式

在处理集合操作、事件监听、线程任务等场景时,程序员想要简化编程模型,同时提高代码的可读性,于是引入Lambda表达式。

(1)简化匿名内部类的使用。 java8之前需要编写匿名内部类,代码冗长。
(2)支持函数式编程风格。函数式编程强调将计算视为一系列函数的应用,通过组合简单的函数来构建复杂的计算过程。Lambda表达式支持java更方便的采用函数式编程。
(3)增强集合操作。流(Stream)API允许程序员以声明性方式处理集合(如List、Set等)数据。Lambda表达式与流API结合使用,可以非常简洁地表达复杂的数据处理逻辑,如过滤、映射、归约等。
(4)便于实现回调函数。在处理异步操作或事件监听等场景时,通常需要提供回调函数。Lambda表达式提供了一种方便的方式来定义这些回调函数,使得代码更加简洁且易于理解。
(5)线程和任务执行。在Java 8之前,使用线程通常需要实现Runnable或Callable接口。通过Lambda表达式,程序员可以更简洁地创建线程任务,无需编写额外的匿名内部类。

2.什么是Lambda表达式

(1)Lambda表达式在逻辑上等同于定义了一个实现了函数式接口的匿名内部类,并且这个匿名内部类中包含了一个(且只有一个)与函数式接口抽象方法签名相匹配的方法。
(2)但是,这个匿名内部类并不是以传统意义上Java匿名内部类的形式存在(即不是一个独立的.class文件),而是被编译成了一种可以让JVM理解并执行的内部表示。
(3)当Lambda表达式被“调用”时(尽管这个词可能不太准确,因为Lambda表达式本身不是可调用实体),实际上是在创建一个这样的匿名内部类的实例,并调用其实现的抽象方法。但是,由于Lambda表达式的简洁性,你通常不需要显式地创建这个实例或调用方法;相反,Lambda表达式可以被直接赋值给函数式接口类型的变量,或者在需要函数式接口实例的地方直接使用。

3.怎么用Lambda表达式

Lambda表达式两种用法

(1)被赋值给一个函数式接口类型的变量

下面是一个函数式接口:

@FunctionalInterface  
public interface Consumer<T> {  
    void accept(T t);  
}

下面的变量consumer就是一个函数式接口类型的变量

Consumer<String> consumer = System.out::println;  
consumer.accept("Hello, World!"); // 输出: Hello, World!

而lambda表达式的第一个用法就是被赋值给一个函数式接口类型的变量。
解析:该变量引用了一个匿名实例,这个匿名实例通过lambda实现函数式接口而得来,而lambda实现函数式接口的具体的实现方案是把accept方法实例化为一个打印语句。引用的是实例,lambda是工具,实现的是接口,实例化的是方法。

(2)作为参数传递给接受函数式接口作为参数的方法

注意:当Lambda表达式被赋值给一个变量时,它并没有立即执行;它只是在内存中创建了一个实现了函数式接口的匿名内部类(或类似的内部表示)的实例,并将这个实例的引用赋给了变量。此时,Lambda表达式“出现”了,但它还没有被“调用”。Lambda表达式真正被执行(或说被“调用”)的时刻,是当这个变量(或包含Lambda表达式的参数)被用作函数调用的一部分时。

@FunctionalInterface  
interface IntOperation {  
    int operate(int a, int b);  
}

定义一个方法,它接受一个IntOperation接口的实现作为参数

public class LambdaExample {  
  
    // 定义一个方法,它接受一个IntOperation接口的实现作为参数  
    public static int performOperation(int x, int y, IntOperation operation) {  
        return operation.operate(x, y);  
    }  
  
    public static void main(String[] args) {  
        // 使用Lambda表达式作为参数调用performOperation方法  
        // 这个Lambda表达式实现了IntOperation接口的operate方法  
        int sum = performOperation(5, 3, (a, b) -> a + b);  
        System.out.println("Sum: " + sum); // 输出: Sum: 8  
  
        // 另一个Lambda表达式,实现减法  
        int difference = performOperation(5, 3, (a, b) -> a - b);  
        System.out.println("Difference: " + difference); // 输出: Difference: 2  
  
        // 以此类推,可以传递任何实现operate方法的Lambda表达式  
    }  
}

你可能感兴趣的:(笔记,每日面经整理,开发语言,java,lambda,函数式编程)