Lambada
Lambda表达式是Java中的一个重要特性,用于简化函数式编程。它提供了一种更简洁的方式来编写匿名函数,可以被赋值给一个变量,或者作为参数传递给其他方法。
Lambda表达式的基本语法如下:
(parameter1, parameter2, ..., parameterN) -> { // 方法体 }
其中,括号内的参数是方法的参数列表,箭头符号"->"是Lambda操作符,箭头符号前面是参数列表,箭头符号后面是方法体。
Lambda表达式可以具有零个、一个或多个参数,方法体可以是一条语句或一个代码块。当方法体只有一条语句时,可以省略大括号和return关键字。
Lambda表达式的作用是简化代码,提高代码的可读性。它可以替代传统的匿名内部类的使用方式,使代码更加简洁。在函数式编程中,Lambda表达式常用于实现函数式接口(Functional Interface),以便可以直接调用接口中的抽象方法。
Lambada 原理
Lambada表达式是Java 8中引入的一种新特性,它是一种匿名函数,可以被作为参数传递给方法或存储在变量中。
Lambada表达式的原理是基于函数式编程的概念。函数式编程是一种编程范式,其中函数被视为一等公民,可以像其他类型的变量一样被传递、存储和操作。Lambada表达式允许我们以一种简洁、灵活的方式定义函数。
Lambada表达式的语法如下: (parameter1, parameter2, ..., parameterN) -> { body }
其中,参数列表可以为空,也可以包含多个参数,用逗号分隔。箭头符号 "->" 将参数列表与函数体分隔开来。函数体可以是一条表达式,也可以是一个代码块。
Lambada表达式的执行方式与普通的方法调用类似,可以直接调用,也可以作为参数传递给其他方法。
Lambada表达式的优势在于它的简洁性和灵活性。它不需要显式地定义方法,可以在需要的地方直接定义函数逻辑。这样可以减少代码量,并提高代码的可读性和维护性。此外,Lambada表达式可以捕获外部的局部变量,使得函数可以访问外部环境的状态。
在 Java 中,Lambda 表达式通过接口的实例化进行调用。Lambda 表达式可以转换为函数式接口的实例,而函数式接口是只有一个抽象方法的接口。
在底层,Java 编译器将 Lambda 表达式转换为一个匿名类,该匿名类实现了函数式接口,然后将 Lambda 表达式的方法体作为该匿名类的实现。对于每个 Lambda 表达式,编译器生成一个方法,该方法包含 Lambda 表达式的代码。
当调用 Lambda 表达式时,实际上是调用了函数式接口的方法。编译器会根据 Lambda 表达式的参数和返回值类型,以及函数式接口方法的参数和返回值类型进行类型检查。然后,将 Lambda 表达式转换为函数式接口的实例,然后调用函数式接口的方法。
在运行时,JVM 会创建函数式接口的实例对象,并调用其方法。底层的调用过程与调用普通接口方法类似,只是被调用的方法是 Lambda 表达式的方法体。
案例
package com.fish.modeltest.test;import java.io.File;
import java.io.FileFilter;/*** @program: model-test* @description:* @author: lyl* @create: 2024-05-28 14:42**/
import java.io.File;
import java.io.FileFilter;public class LambadaTest {public static void main(String[] args) {/*** JDK8之后推出了一个新的特性:lambda表达式* lambda表达式可以用更精简的方式创建匿名内部类。* 语法:* (参数列表)->{* 方法体* }* 不是所有匿名内部类创建的情景都可以替换为lambda.前提要求是实现的接口只能有一个抽象方法时才可以* 使用lambda表达式。*/FileFilter filter = new FileFilter() {public boolean accept(File file) {return file.getName().contains("o");}};//忽略了接口名和方法名FileFilter filter1 = (File file) -> {return file.getName().contains("o");};//参数类型可以忽略。如果方法只有一个参数时,那么"()"也可以忽略。FileFilter filter2 = file -> {return file.getName().contains("o");};//如果方法体只有一句代码,那么可以将方法体"{}"忽略,如果含有return则return要一同忽略FileFilter filter3 = file -> file.getName().contains("o");File dir = new File(".");
// File[] subs = dir.listFiles(new FileFilter() {
// public boolean accept(File file) {
// return file.getName().contains("o");
// }
// });File[] subs2 = dir.listFiles(f->f.getName().contains("o"));/*lambda表达式也是编译器认可的,最终会被编译器改回成内部类创建的形式*/File[] subs = dir.listFiles(f -> f.getName().contains("o"));}
}
总结
Lambda表达式是Java 8引入的一种新的语法特性,用于简化函数式编程中的匿名函数的定义和使用。它可以替代使用匿名内部类的方式来定义函数式接口的实例。
Lambda表达式由三个部分组成:
- 参数列表:指定了Lambda表达式所需要的输入参数。如果没有参数,可以使用空括号表示。
- 箭头符号:箭头符号"->"用于分隔参数列表和Lambda表达式的主体部分。
- Lambda主体:指定了Lambda表达式的执行逻辑,可以是一个表达式或一个代码块。
Lambda表达式的语法如下所示: (parameter1, parameter2, ...) -> { // Lambda主体 }
Lambda表达式可以根据上下文的类型进行类型推断,因此可以省略参数类型的声明。另外,如果Lambda主体只有一行代码,可以省略大括号和return关键字。
Lambda表达式可以用于替代使用匿名内部类的情况,特别适用于函数式接口的实现。函数式接口是指只包含一个抽象方法的接口,可以使用@FunctionalInterface注解标记。
Lambda表达式具有以下特点:
- 可以捕获外部的局部变量或参数,使其成为Lambda表达式的闭包。
- 可以作为参数传递给方法或函数,并作为返回值返回。
- 可以使用Java 8中新增的函数式接口,以及Java标准库中的函数式接口,如Predicate、Consumer等。
- 可以与Java 8的流(Stream) API一起使用,实现函数式编程的功能。