数据结构系列17——lambda表达式

news2024/11/27 8:43:26

目录

1. 基本概念

2. 基本语法

3. 函数式接口

4. Lambda表达式的基本使用 

4.1 语法精简

5. 变量捕获

6. Lambda在集合当中的使用


1. 基本概念

        Lambda表达式是Java SE 8中一个重要的新特性。lambda表达式允许你通过表达式来代替功能接口。 lambda表达式就和方法一样,它提供了一个正常的参数列表和一个使用这些参数的主体(body,可以是一个表达式或一个代码块)。

2. 基本语法

基本语法: (parameters) -> expression 或 (parameters) ->{ statements; }

Lambda表达式由三部分组成:
1. paramaters:类似方法中的形参列表,这里的参数是函数式接口里的参数。这里的参数类型可以明确的声明也可不声明而由JVM隐含的推断。另外当只有一个推断类型时可以省略掉圆括号。
2. ->:可理解为“被用于”的意思
3. 方法体:可以是表达式也可以代码块,是函数式接口里方法的实现。代码块可返回一个值或者什么都不返回,这里的代码块块等同于方法的方法体。如果是表达式,也可以返回一个值或者什么都不返回。

// 1. 不需要参数,返回值为 2
() -> 2
// 2. 接收一个参数(数字类型),返回其2倍的值
x -> 2 * x
// 3. 接受2个参数(数字),并返回他们的和
(x, y) -> x + y
// 4. 接收2个int型整数,返回他们的乘积
(int x, int y) -> x * y
// 5. 接受一个 string 对象,并在控制台打印,不返回任何值(看起来像是返回void)
(String s) -> System.out.print(s)

3. 函数式接口

        要了解Lambda表达式,首先需要了解什么是函数式接口,函数式接口定义:一个接口有且只有一个抽象方法 。

注意:
1. 如果一个接口只有一个抽象方法,那么该接口就是一个函数式接口
2. 如果我们在某个接口上声明了 @FunctionalInterface 注解,那么编译器就会按照函数式接口的定义来要求该接
口,这样如果有两个抽象方法,程序编译就会报错的。所以,从某种意义上来说,只要你保证你的接口中只
有一个抽象方法,你可以不加这个注解。加上就会自动进行检测的。

定义的方式

@FunctionalInterface
interface NoParameterNoReturn {
//注意:只能有一个方法
  void test();
}

回顾:这里简要回顾一下抽象方法和抽象类以及接口中的下相关知识

抽象方法:

        java中的抽象方法就是以abstract修饰的方法,这种方法只声明返回的数据类型、方法名称和所需的参数,没有方法体,也就是说抽象方法只需要声明而不需要实现。

抽象方法与抽象类:

        当一个方法为抽象方法时,意味着这个方法应该被子类的方法所重写,否则其子类的该方法仍然是abstract的,这个子类由于继承父类,拥有抽象方法,因此它也是抽象类,即声明为abstract。abstract抽象类不能用new实例化对象,abstract方法只允许声明不能实现。如果一个类中含有abstract方法,那么这个类必须用abstract来修饰,当然abstract类也可以没有abstract方法。 一个抽象类里面没有一个抽象方法可用来禁止产生这种类的对象。

抽象方法与接口:

        在interface中所有的方法都是public abstract的,即使你没有声明它是public abstract的。在interface中所有的数据成员都是public static final的,即使你没有声明.但不能是blank final 在编译时候确定的。在java中,interface的地位和class是一样的。实现interface的类,其interface中所有的方法必须被“实现”,否则这个类成为一个抽象类。Interface可以从多个interface得到继承,但是不能继承类。一个类可以实现多个interface。

回到正题

lambda表达式在jdk1.8有了新的特性,可以有静态成员方法和默认的方法

4. Lambda表达式的基本使用 

1.首先定义了六个接口(并且是函数式接口)

 2. 使用lambda表达式使用这些接口

public class test {
    public static void main1(String[] args) {
        NoParameterNoReturn noParameterReturn = new NoParameterNoReturn() {
            //1. 正常情况下使用接口,需要重写接口的方法
            @Override
            public void test() {
                System.out.println("hello");
            }
        };
    }

    public static void main(String[] args) {
        //1.此时为没有参数没有返回值的lambda表达式
        NoParameterNoReturn noParameterNoReturn = ()->{System.out.println("hello");};
        noParameterNoReturn.test();

        //2.含有一个参数,没有返回值的lambda表达式
        //                                     此时可以省略括号与参数类型 还有大括号
        OneParameterNoReturn oneParameterNoReturn = (int x)->{System.out.println(x+10);};
        oneParameterNoReturn.test(10);

        //3.含有多个参数,没有返回值的lambda表达式
        //                                            不能省略括号,类型不能单独省略,只能同时省略
        MoreParameterNoReturn moreParameterNoReturn = (int x, int y)->{
            System.out.println(x+y);
        };
        moreParameterNoReturn.test(1,2);

        //4.没有参数有返回值
        //                                        此时可以省略return
        NoParameterReturn noParameterReturn = ()->{return 10;};
        int ret1 = noParameterReturn.test();
        System.out.println(ret1);

        //5.一个参数有返回值
        //                                    能省略括号;可以省略return
        OneParameterReturn oneParameterReturn = (x)->{return x;};
        int ret2 = oneParameterReturn.test(10);
        System.out.println(ret2);

        //6.一个参数有返回值
        //                                    不能省略括号;可以省略return
        MoreParameterReturn moreParameterReturn = (int x, int y)->{return x*y;};
        MoreParameterReturn moreParameterReturn2 = (x, y)->x * y;;
        int ret3 = moreParameterReturn.test(10,20);
        System.out.println(ret3);
    }
}

运行结果: 

4.1 语法精简

1. 参数类型可以省略,如果需要省略,每个参数的类型都要省略。
2. 参数的小括号里面只有一个参数,那么小括号可以省略
3. 如果方法体当中只有一句代码,那么大括号可以省略
4. 如果方法体中只有一条语句,且是return语句,那么大括号可以省略,且去掉return关键字。

5. 变量捕获

1. 匿名内部类简单使用

2. 匿名内部类的变量捕获

在上述代码当中的变量a就是,捕获的变量。这个变量要么是被final修饰,如果不是被final修饰的 你要保证在使用之前,没有修改。

 

 3. Lambda的变量捕获

6. Lambda在集合当中的使用

1.List接口

1.1sort()方法的演示

该方法根据c指定的比较规则对容器元素进行排序。

 运行结果:

1.2 forEach

 运行结果

2. map

forEach

此处就是与Sort重写的方法不相同,看源码为:

 那么就需要重写accept函数,进行使用lambda表达式

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

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

相关文章

再聊ChatGPT(关于安全,隐私和法律方面的风险)

我在上一篇博文中有谈到ChatGPT 发展可能会经历的一些阶段。ChatGPT的必经阶段:野蛮生长时代-管理层监管与风险提示-号召国产化-规范化常态化。 昨天刚好看到监管部门发文 说明监管部门已经意识到到ChatGPT野蛮生长阶段,其实是存在很多漏洞和问题的。 …

2022年 全国职业院校技能大赛(中职组)网络安全赛项 正式赛卷 A模块 做题记录

评分标准文件及环境 评分标准:ZZ-2022029 网络安全赛项正式赛卷.zip 自己做的Linux靶机: 自己做的Windows靶机: 文章目录评分标准文件及环境A-1 任务一 登录安全加固1. 密码策略(Windows,Linux)a. 最小密码…

年少不知回损好,却把插损当作宝

一博高速先生成员:黄刚 因为本期要讲的是插损和回损的关系,因此本文的开头,我们还是首先回顾下S参数的概念。首先我们需要知道S参数其实是个黑匣子,什么是黑匣子呢,那就是我们其实不需要知道它包含了哪些链路结构&…

steam游戏搬砖项目怎么做?月入过万的steam搬砖项目教程拆解

steam游戏搬砖项目怎么做?月入过万的steam搬砖项目教程拆解 大家好,我是童话姐姐,今天继续来聊Steam搬砖项目。 Steam搬砖项目也叫CSGO搬砖项目,它并不是什么刚面世的新项目,是已经存在至少七八年的一个资深老牌项目。这个项目…

QT4与QT5兼容问题

QT4 与QT5 兼容,源码差异部分通过QT_VERSION 宏来区分 常见区别 widgets prinsupport charts 等模块一如方式,Qt5 将QtWidgets QtPrintsupport 模块从QtGui 中分离出来,QT4 中没有qjson4 和 charts 模块,需要特殊处理 在pro文件…

SpringSecurity之基础认知

前言 之前一直说开一个SpringSecurity的专栏,今天抽空整理一下,准备开始更新。 也欢迎大家订阅此专栏! 什么是SpringSecurity? Spring是非常成功的Java应用框架,目前是非常主流的开发框架。Spring Securtiy正是我们…

RPC 漫谈: 限流问题

RPC 漫谈: 限流问题 微服务之间的 RPC 调用往往会使用到限流功能,但是很多时候我们都是用很简单的限流策略,亦或是工程师拍脑袋定一个限流值。 这篇文章主要讨论在 RPC 限流中,当前存在的问题和可能的解决思路。 为什么需要限流…

Tailwind CSS 小案例,创建漂亮的收藏卡片列表

作为人类,我们有一种天生的倾向,喜欢收集不同的物品,并根据兴趣将它们分组。从邮票到书籍,人们收集和分组的物品种类繁多。定义上,收藏是一组事物,通常是由某个人创建的。例如,很多孩子会收集漫…

Docker In Docker

Docker in Docker 适用场景 ​ 在 CI 中,通常会有一个 CI Engine 负责解析流程,控制整个构建过程,而将真正的构建交给 Agent 去完成。例如,Jenkins 、GitLab 均是如此 同时 Agent 是动态的,构建时才需要,…

查询淘宝商品历史价格(用Python记录商品每天价格变化)

taobao.item_history_price-获取淘宝天猫历史价格接口 思路: 第一步抓取商品的价格存入 Python 自带的 SQLite 数据库每天定时抓取商品价格使用 pyecharts 模块绘制价格折线图,让低价一目了然 接口说明:通过接口可以拿到整个平台&#xff0…

Tomcat源码:Container接口

参考资料: 《Tomcat - Request请求处理: Container设计》 《Tomcat - Container容器之Engine:StandardEngine》 前文: 《Tomcat源码:启动类Bootstrap与Catalina的加载》 《Tomcat源码:容器的生命周期管理与事件监…

matplotlib绘图看这篇就够了

导入matplotlib第三方库此外,在matplotlib中我们可以只输入y轴,即为只输入一个数组我们也可以输出,x不为必要条件。而且也可以使用plt.xticks()函数进行设置x轴的label。import matplotlib.pyplot as plt plt.rcParams[font.sans-serif] [Si…

注意力机制中Q和K相乘的意义是什么?为什么Q和K相乘就可以得到它们之间的相似性/权重矩阵呢?

为什么query和key相乘就能得到学生和教师的相似度呢?它的内部原理是什么? 在注意力机制中,query 和 key 相乘得到的相似度其实是通过计算两个向量之间的点积来实现的。具体而言,我们将 query 和 key 进行点积运算后【这里的点积运算可以看作…

从C出发 23 --- 函数专题练习

A:我们可以将 main 理解为操作系统调用的函数,操作系统运行一个应用程序时,就去调用这个应用程序里面的main函数 B: 函数中只能定义变量,定义的变量叫局部变量 C: 从操作系统的角度来看 C 并不一定正确,因为从技术角…

Cadence OrCAD Capture 层次化电路设计展开的方法

🏡《总目录》   🏡《宝典目录》   🏡《上级目录》 目录1,概述2,展开方法3,总结B站关注“硬小二”浏览更多演示视频 1,概述 典型的层次化设计是指顶层模块中,调用1个电路模块超过…

Java中的并发容器

Java 中的 并发容器 1.List 类 list类 线程安全的主要有 Vector 与 CopyOnWriteArrayList a). Vector Vector 相当于在 原有 ArrayList类的基础上将所有方法 变成同步方法 同样的操作还有 Collections.synchronizedList() 方法,将原有Lis…

自训练Self-Training学习总结

一、自训练(Self-training) Self-training是最简单的半监督方法之一,其主要思想是找到一种方法,用未标记的数据集来扩充已标记的数据集。算法流程如下: 首先,利用已标记的数据来训练一个好的模型&#xf…

ch04-损失优化

ch04-损失优化0.引言1.权值初始化1.1. 梯度消失与爆炸1.2. Xavier 初始化1.3. Kaiming 初始化1.4. 常用的权值始化方法1.5. nn.init.calculate_gain1.6. 总结2.损失函数 (一)2.1. 损失函数的概念2.2. 交叉熵损失函数 nn.CrossEntropyLoss2.3. NLL/BCE/BCEWithLogits Loss2.4. 总…

什么原因导致了儿童自闭症?跟父母养育有关吗?

导致儿童自闭症的原因是什么?这和父母的抚养有关吗?学习教育孩子的方法,让孩子快乐健康地成长,是家庭和孩子生活中的一件重要事情。不良的环境和错误的教育会导致儿童自闭症,这是真的吗?自闭症,…

1、vscode搭建C++开发环境及一些配置文件的含义

文章目录一、vscode搭建开发环境1、下载和配置MinGW-w64 编译器套件2、安装到电脑中3、配置环境变量4、测试是否安装成功5、vscode上安装C/C插件二 、配置编译环境时各个文件的含义1、task.json:此文件告诉VS代码如何构建(编译)程序&#xff…