Lambda表达式及应用

目录

    • Lambda表达式
      • 概念
      • 应用
        • 在forEach()方法使用
        • 用来替代匿名内部类
          • 代码验证(Lambda表达式替代匿名内部类)

Lambda表达式

概念

语法形式: () -> {}
组成:

  1. 括号:表示参数列表;
  2. 箭头:表示lambda运算符,读作goes to;
  3. 花括号:表示方法体。

参数列表相关概念:

参数个数:
无参数,或者,1个或多个;
另外,只有一个参数时括号可以省略。

参数的类型:
一般不定义参数类型,由编译器推理得到,或者特殊情况下,可以自己指定这些参数的类型。

方法体:
方法体中可以放参数相关的多句执行语句,也可以有return语句,当代码语句只有一句时,花括号可以省略。不在方法体中定义新的方法。有待考证*1

应用

在forEach()方法使用

Arrays.asList(1, 2, 3, 4, 5).forEach(x -> System.out.println(x));

用来替代匿名内部类

1、继承式匿名内部类如下:

new “类名”(){}

Lambda表达式代替:无法替代。有待考证*2
匿名内部类的花括号内是空的,对应Lambda表达式花括号内也是空的,但会【报错】Not a statement。说明不能是空的,得有执行语句。

2、接口式匿名内部类如下:

new “接口名”(){//重写这个父类“接口名”的一些或全部方法public 返回类型 方法名(参数类型 参数){//代码执行语句}
}

Lambda表达式代替:

  1. 当接口只有一个方法时,重写方法只有一个时,Lambda表达式可以成功代替。
(参数)->{//重写方法对应的代码执行语句
}
  1. 当接口只有多个方法时,即重写方法有多个时,Lambda表达式无法按上述1中格式:把每个重写方法的执行语句写上。
    【报错】:Multiple non-overriding abstract methods found in interface test.CarFun。

有待考证*3:是不是我不知道接口多个方法时,Lambda表达式的替换接口式匿名内部类的方法。

代码验证(Lambda表达式替代匿名内部类)

代码示例:

接口CarFun.java:
在这里插入图片描述

main函数验证:Test.java

下图在main函数下写了接口式匿名内部类。并用zerocarfun调用了drive()和stop()方法。接下来要写一个Lambda表达式替换它。
在这里插入图片描述

  1. Lambda表达式只重写一个方法drive()情况下:
    在这里插入图片描述
    对应上图,替换成Lambda表达式后,执行代码结果:
zero开车了,已经开了0.7928757329649554千米

说明替换成功了。

  1. Lambda表达式重写drive()和stop()多个方法情况下:
    先打开CarFun中第5行代码注释。
    在这里插入图片描述
    CarFun接口添加stop()方法后。【报错】:在CarFun接口中找到多个非重写的抽象方法。

在这里插入图片描述

在Lambda表达式里添加stop()方法的执行语句:

System.out.println("zero停车了");

在这里插入图片描述
仍然【报错】:在CarFun接口中找到多个非重写的抽象方法。

不知道如何用Lambda表达式替代,有多个方法的接口式匿名内部类。

考证*3
百度一下报错信息。
知道:@FunctionalInterface会告诉编译器可以用Lambda表达式。
我很好奇这个是什么注解?我在接口上写了这个注解。
也【报错】:在CarFun接口中找到多个非重写的抽象方法。

我点进源码,查看了这个注解的概述。猜猜我发现了什么?我发现了一个关键句子:

Conceptually, a functional interface has exactly one abstract method.

从概念讲,一个functional interface有且仅有一个抽象方法。

进一步百度functional interface。
发现这个是函数式接口的意思。
结合上面百度到的:@FunctionalInterface会告诉编译器可以用Lambda表达式。

说明:Lambda表达式替换接口式匿名内部类时,这个匿名内部类相对应的接口只能有一个抽象方法。

结论:Lambda表达式替代接口式匿名内部类时,相对应的接口是一个函数式接口。

进一步,查看Predicate源码时发现,函数式接口只有一个抽象方法,但可以有多个default修饰的非抽象的方法,或者非抽象的静态方法。

考证*2
进一步百度,了解,Lambda表达式替代匿名内部类,指就是上述结论中的情况,替代接口式匿名内部类,不是替代继承式匿名内部类。

考证*1
从替代接口式匿名内部类角度看:花括号方法体中不定义新的方法,也不写方法名,直接写重写的代码执行语句即可。

有待进一步考证*1

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/549207.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

网络地址和广播地址的快速计算方法

目录前提条件方法原理网络地址快速计算示例广播地址快速计算示例前提条件 由IP地址和子网掩码,快速计算网络地址和广播地址。 小窍门前提:当子网掩码组成只有255和0组成时。 方法原理 利用255(或者0)和其他数字的&&#xf…

把十六进制字符转换成十进制数

2019独角兽企业重金招聘Python工程师标准>>> /*** Get the hex value of a character (base16).* param c A character between 0 and 9 or between A and F or* between a and f.* return An int between 0 and 15, or -1 if c was not a hex digit.*/public stat…

SQL Server更新某一列中多个字典码对应内容(sql示例)

目录示例-查询出多个字典码对应的内容示例-替换多个字典码对应的内容说明CHARINDEXFOR XML PATH示例-查询出多个字典码对应的内容 建立表格:学生-学习科目表student_study 注意:科目kemu列内容是字典码,需要更换成对应内容。 建立表格&…

mybatisPlus中的field-strategy(字段更新插入策略):null值插入和更新问题

目录mybatisPlus中null值插入和更新问题实际项目解决方法示例一实际项目解决方法示例二field-strategy字段更新插入策略介绍枚举类FieldStrategy源码枚举类字段简介mybatisPlus中null值插入和更新问题 配置mybatisPlus的项目中,默认进行了不是全量更新的策略&#…

linux构建主从域名服务器

实验步骤:一、构建主域名服务器1、安装域名服务(BIND服务器软件包)BIND软件包是目前Linux下使用最广泛的DNS服务器安装包,它可以运行到大多数UNIX服务器中,也包括Linux系统。RHEL4默认没有安装BIND服务器软件包&#x…

管道过滤器(Pipe-And-Filter)模式

按照《POSA(面向模式的软件架构)》里的说法,管道过滤器(Pipe-And-Filter)应该属于架构模式,因为它通常决定了一个系统的基本架构。管道过滤器和生产流水线类似,在生产流水线上,原材料在流水线上经一道一道的…

PCI_Express规范第七章解读-Software Initialization and configuration

7.Software Initialization and configuration PCI EXPRESS Configuration model 支持两种配置空间的访问机制: -PCI 兼容配置机制:100%的二进制兼容PCI 2.3中定义的,以及兼容早期的OS或类似的总线枚举和配置软件。 -PCI Express增强配置机制…

Asp.net基础概念之 事件

.NET Framework中的事件 事件体系结构 引发事件的对象叫做事件源。事件源发布它可以引发的事件。事件的类型总是委托类型,这个委托类型的签名定义了处理该事件的方法的签名。定义事件处理程序方法的对象称为事件接收方。事件接收方预订要在事件源上处理的事件事件接…

Facebook图片存储架构技术全解析

Haystack提出了一种通用的基于HTTP的对象存储,它含有指针,映射到存储对象。在Haystack中以指针储存照片,把数以十万计的图像聚集到一个Haystack存储文件,从而消除了元数据负荷。这就使得元数据的开销非常小,并且使我们…

Shiro授权流程图

Shiro授权流程Shiro授权流程图Shiro授权流程图 根据Shiro授权流程,绘制流程图如下:

js中toFixed方法的两个坑

js中toFixed方法的两个坑toFixed返回结果是string,后续使用它计算会错误toFixed返回结果可能出现负零-0.00toFixed返回结果是string,后续使用它计算会错误 代码演示: 类型判断代码示例: var stringNum (100.101).toFixed(2); v…

外挂:一个很杯具的关键字

在网页挂马泛滥的时代,盗号***不缺少传播到用户电脑的通道,因为只需要找一些与游戏有关的网站,或者在流量大的网站把网马一挂,就不愁钓不着鱼。如今,时代在变迁,安全软件已经成功的解决了网页挂马这个难题&…

java.lang.ClassNotFoundException: retrofit2.Retrofit$Builder解决思路

ClassNotFoundException报错具体问题报错详情推测可能是jar包问题问题总结自定义依赖缺少依赖jar具体问题 Caused by: java.lang.NoClassDefFoundError: retrofit2/converter/simplexml/SimpleXmlConverterFactory报错详情 org.springframework.web.util.NestedServletExcept…

图像质量评估方法——结构相似性指数(SSIM)

结构相似性指数(SSIM)是一种全参考图像质量评估方法,用于比较两幅图像的相似性。 SSIM的计算涉及到亮度(Luminance)、对比度(Contrast)和结构(Structure)三个方面的相似性…

SQL SERVER重置自动编号列(标识列)

为什么80%的码农都做不了架构师?>>> 两种方法: 一种是用Truncate TRUNCATE TABLE name 可以删除表内所有值并重置标识值 二是用DBCC CHECKIDENT DBCC CHECKIDENT (table_name, RESEED, new_reseed_value) 如dbcc checkident ("bc_pos&q…

“街坊”×××数字平台,昔日的思想,曾经的努力

“街坊”数字平台“街坊”数字平台由“街坊”网站(http://www.jefun.cn/)、街坊售楼系统软件(http://real.jefun.cn/soft/)、街坊二手房交易系统软件(http://zu8.bj.jefun.cn/soft/)三大部分组成,集成了互联网、电话、短信、软件、GIS等诸位一体的技术与服务手段为用…

postfixadmin 导入数据库出错 ERROR 1062 (23000) at line 29

ERROR 1062 (23000) at line 29: Duplicate entry localhost-postfix-postfix for key 1 解决方法 [rootnagios-server postfixadmin]# mysql -uroot -p111111 <DATABASE_MYSQL.TXT ERROR 1062 (23000) at line 29: Duplicate entry localhost-postfix-postfix for key 1 删…

SharePoint最简母版页

代码 <%Master language"C#"%><% Register Tagprefix"SharePoint"Namespace"Microsoft.SharePoint.WebControls"Assembly"Microsoft.SharePoint, Version12.0.0.0, Cultureneutral, PublicKeyToken71e9bce111e9429c"%><…

封装自定义的redis切库工具类ByteArrayRedisTemplate,读取byte数组反序列化成List<Object>

封装自定义的redis切库工具类ByteArrayRedisTemplate&#xff0c;读取byte数组反序列化成List&#xff1c;Object&#xff1e;&#xff08;使用lettuce连接池&#xff09;代码环境框架&#xff1a;springboot依赖&#xff1a;spring-boot-starter-data-redis步骤1&#xff1a;注…

redis的zset使用(java)——存取List< Object>

1 需求 要往redis存取List< Object>。 2 条件 1&#xff09;Object&#xff1a;是一个UserEvent对象&#xff0c;对应3个字段&#xff1a; Integer productId; String eventCode; Long timestamp;2&#xff09;要求 每个key里存取对象个数不超过xx个。 超过xx个&…