Lambada表示式

news/2024/9/24 0:25:37/

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表达式由三个部分组成:

  1. 参数列表:指定了Lambda表达式所需要的输入参数。如果没有参数,可以使用空括号表示。
  2. 箭头符号:箭头符号"->"用于分隔参数列表和Lambda表达式的主体部分。
  3. Lambda主体:指定了Lambda表达式的执行逻辑,可以是一个表达式或一个代码块。

Lambda表达式的语法如下所示: (parameter1, parameter2, ...) -> { // Lambda主体 }

Lambda表达式可以根据上下文的类型进行类型推断,因此可以省略参数类型的声明。另外,如果Lambda主体只有一行代码,可以省略大括号和return关键字。

Lambda表达式可以用于替代使用匿名内部类的情况,特别适用于函数式接口的实现。函数式接口是指只包含一个抽象方法的接口,可以使用@FunctionalInterface注解标记。

Lambda表达式具有以下特点:

  1. 可以捕获外部的局部变量或参数,使其成为Lambda表达式的闭包。
  2. 可以作为参数传递给方法或函数,并作为返回值返回。
  3. 可以使用Java 8中新增的函数式接口,以及Java标准库中的函数式接口,如Predicate、Consumer等。
  4. 可以与Java 8的流(Stream) API一起使用,实现函数式编程的功能。





















 


http://www.ppmy.cn/news/1463748.html

相关文章

Python考试练习题---day1

1.计算2的n次幂结果的后3位 获得用户输入的一个数字N,计算并输出2的N次幂结果的后3位。 【输出样例】-----因为2的10次方等于1024 输入10输出024 ninput() print(str(2**eval(n))[-3:]) 2.分割四位正整数 例1: 编写程序,提示用户从键盘…

UE5 Cesium2 最新使用地理配准子关卡构造全球场景

参考官方最新教程:Building Global Scenes with Georeferenced Sublevels – Cesium 创建持久关卡(主关卡) 这里一般包含DynamicPawn、CesiumSunSky 和 Cesium World Terrain 全球场景通用的对象。子关卡的创立,官方教程分为了两…

【Unity实战】Mirror/UNET中SyncVar和SyncList需要注意的点

SyncVar和SyncList在Unity开发中喜闻乐见,常用于脚本中字段的同步。 但也时常会出现修改了但是没同步的问题。 故本人根据过往踩的坑进行了以下总结: 1. 尽量不要用它进行类的同步 在Unity中,[SyncVar] 特性通常用于同步Unity网络游戏中基…

Advanced Installer 问题集锦

1、界面在主题中显示的图标,如logo、发布者名称、产品名称就算在设计界面时删除,但是下次打开工程依然存在 解决办法:“可见”属性设置为禁用 2、在不关闭软件的情况下,使用"文件->打开"来切换项目,再次…

Android11 事件分发流程

在Android 11 输入系统之InputDispatcher和应用窗口建立联系一文中介绍到,当InputDispatcher写入数据后,客户端这边就会调用handleEvent方法接收数据 //frameworks\base\core\jni\android_view_InputEventReceiver.cpp int NativeInputEventReceiver::h…

贪心算法简单介绍

贪心算法是一种在每一步选择中都采取当前状态下最优或最优近似的选择,以期望最终得到全局最优解的算法。贪心算法并不总能得到全局最优解,但在某些问题上,它可以得到全局最优解,并且比动态规划等其他方法更为简单和高效。 贪心算…

MiniCPM-Llama3-V-2_5-int4

MiniCPM-Llama3-V-2_5-int4大模型部署使用环境: python3.8cuda11.8其它要求,按照安装文档要求下载即可 我是在算力平台用4090跑的, GPU 显存(8GB)可以部署推理 int4 量化版本,如果推理非量化版本需要更高显…

当HR问你是否单身时,该怎么回答?

知识星球(星球名:芯片制造与封测技术社区,星球号:63559049)里的学员问:我是晶圆厂厂务工程师,最近在面试新工作,但是几乎每家HR都会问我同一个问题:你结婚没有&#xff1…