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

目录

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表达式

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

循环依赖详解及解决方案

介绍 上图就是循环依赖的三种情况,虽然方式不同,但是循环依赖的本质是一样的,就A的完整创建要依赖与B,B的完整创建要依赖于A,相互依赖导致没办法完整创建造成失败. 循环依赖代码演示 public class Demo {public static void main(String[] args) {new Demo1();} }class Demo1…

打造出ChatGPT的,是怎样一群人?

震惊世界的ChatGPT,要多少人才能开发出来?几百,还是几千? 答案是:87个人。 老实说,刚看到这个数字真是惊到我了,印象里,之前看媒体报道各大巨头人工智能人才储备时,动辄…

长草

4 5 .g… … …g… … 2 gggg. gggg. ggggg .ggg. #include <iostream> using namespace std;int r,l;char arr[1005][1005];int t;char dp[1005][1005]; int dx[4]{0,0,1,-1},dy[4]{1,-1,0,0}; void dfs(int x,int y) {for(int i0;i<4;i){int axdx[i];int bydy[i];if…

Qt Quick - 分隔器综述

Qt Quick - 分隔器综述一、概述二、MenuSeparator 控件1. 用法&#xff1a;三、ToolSeparator 控件1. 用法一、概述 Qt Quick Controls 提供了多种分隔符&#xff0c;其实就是分割一下MenuBar和ToolBar里面的内容。 控件功能MenuSeparator将菜单中的一组项目与相邻项目分开To…

dolphinscheduler资源中心

资源中心 资源中心介绍 资源中心提供文件管理&#xff0c;UDF管理&#xff0c;任务组管理。 文件管理可以访问要执行的hive的sql文件 UDF管理可以放置fllink执行的自定义udf函数jar包&#xff0c;hive自定义的UDF函数jar包 以上的*.sql,*.jar文件可以理解为资源&#xff0c…

【服务器数据恢复】 重装系统导致xfs文件系统分区丢失的数据恢复案例

服务器数据恢复环境&#xff1a; EMC某型号存储&#xff0c;20块磁盘组建raid5磁盘阵列&#xff0c;划分2个lun。 服务器故障&#xff1a; 管理员执行重装系统操作后发现分区发生改变&#xff0c;原先的sdc3分区丢失&#xff0c;该分区采用xfs文件系统&#xff0c;存储了公司重…

红队内网靶场

文章目录开篇介绍靶场介绍靶场下载以及配置Tomcat Get Shell突破DMZ防火墙拿下域内成员机器将内网机器上线到CS使用Adfind侦察子域信息控制子域DCRadmin登录子域进行权限维持(白银票据/ACL)子域bloodhound获取父域信息分析子域Krbtgt密钥创建跨域金票Dcsync父域PTH父域DC准备打…

什么是 三维渲染内核?

一、引言 随着计算机图形学的发展&#xff0c;三维图形已经成为 电子游戏、动画电影 和 可视化、数字孪生等领域的关键技术。为了将三维模型转换成二维图像&#xff0c;我们需要依赖一个称为三维渲染内核的工具。本文将详细介绍三维渲染内核的原理、实现方法和应用&#xff0c…

每日做题总结——day01

目录 选择题 for循环 指针数组 位段 getchar 大小端存储 进制与格式控制符 位运算 数组指针 二维数组的存储 计算二进制中1的个数 斐波那契数列求递归次数 编程题 删除公共字符 排序子序列 倒置字符串 选择题 for循环 解析&#xff1a;该题主要看for…

面试题React

1.React Fiber是什么&#xff1f; 在 React V16 将调度算法进行了重构&#xff0c; 将之前的 stack reconciler 重构成新版的 fiber reconciler&#xff0c;变成了具有链表和指针的 单链表树遍历算法。通过指针映射&#xff0c;每个单元都记录着遍历当下的上一步与下一步&…

【从零开始学Skynet】工具篇(二):虚拟机文件的复制粘贴

大家在Linux系统下开发的时候肯定会遇到虚拟机与主机间无法复制粘贴的问题&#xff0c;现在我们就来解决这样的问题&#xff0c;方便我们的开发。 1、打开设置 我们可以系统界面的菜单栏点击“控制”&#xff0c;然后打开“设置”&#xff1b; 也可以在VirtualBox界面打开“设…

项目管理中,这些思维误区一定要避开

项目需要在限定的时间要求完成的事情&#xff0c;可控的关键把握是&#xff1a;人、时、事。 但是&#xff0c;项目实施时间一般较长&#xff0c;总有很多项目实施结果不尽人意。那么&#xff0c;IT项目管理过程中&#xff0c;容易出现哪些思维误区呢&#xff1f; 1、忘记项…

TCP三次握手四次挥手及time_wait状态解析

TCP的建立——三次握手 1.服务器必须准备好接受外来的连接。通常通过调用socket&#xff0c;bind&#xff0c;listen这三个函数来完成&#xff0c;我们称之为被动打开(passive open)。 2. 客户端通过调用connect函数发起主动的打开(active open)。这导致客户TCP发送一个SYN(同步…

Nginx基础教程

Nginx 目标 Nginx简介【了解】 Nginx安装配置【掌握】 一、Nginx简介 Nginx称为:负载均衡器或 静态资源服务器:html,css,js,img ​ Nginx(发音为“engine X”)是俄罗斯人编写的十分轻量级的HTTP服务器,是一个高性能的HTTP和反向代理服务器&#xff0c;同时也是一个IMAP/P…

初探MyBatis实现简单查询

文章目录一、创建数据库与表1、创建数据库2、创建用户表3、添加表记录二、基于配置文件方式使用MyBatis1、创建Maven项目2、添加相关依赖3、创建用户实体类4、创建用户映射器配置文件5、创建MyBatis配置文件6、创建日志属性文件7、测试用户操作1)创建用户操作测试类2)测试按编号…

除了Jira、禅道还有哪些更好的敏捷开发过程管理平台?

无论是从国内的敏捷调研开发调研报告还是从国外的敏捷状态调查&#xff0c;工具支持一直是决定敏捷成功的关键因素之一&#xff0c;它们可以帮助团队提高软件开发的效率、质量、协作和满意度。选择合适的敏捷开发管理工具&#xff0c;并正确地使用它们&#xff0c;是每个敏捷团…

数字孪生(1)

目前接触的客户群体是做大屏展示&#xff0c;闲鱼上5元包邮的那种科技感前端&#xff08;不好意思我买了&#xff09;各路模型大整合 实景GISiOT&#xff0c;如果再来点动画就好&#xff0c;然满屏动起来&#xff0c;火灾烧起来&#xff0c;水面荡漾起来&#xff0c;工程车开起…

C/C++每日一练(20230414)

目录 1. 寻找峰值 &#x1f31f;&#x1f31f; 2. 相同的树 &#x1f31f; 3. 整数反转 ※ &#x1f31f; 每日一练刷题专栏 &#x1f31f; Golang每日一练 专栏 Python每日一练 专栏 C/C每日一练 专栏 Java每日一练 专栏 1. 寻找峰值 峰值元素是指其值严格大于左右…

如何借助ChatGPT,自动批量产出短视频爆款文案

如何借助chatgpt批量出爆款文案。 这里我们首先得认识并了解到爆款文案的逻辑。 共通性是打动人&#xff0c;去原创的话&#xff0c;文案能否火&#xff0c;纯靠天吃饭。 所以我们让chatgpt去自己写原创短视频文案&#xff0c;那么chatgpt大概率自由发挥&#xff0c;我们也不…

国产化ChatGPT来袭,景联文科技提供专业数据采集标注服务,人手一个专属ChatGPT或成为可能

ChatGPT作为一个颠覆性的创新&#xff0c;现已成为火爆全球的智能应用。 自ChatGPT爆火以来&#xff0c;国内科技圈开始频频发力&#xff0c;多家科技和互联网公司纷纷表示将开发出中国本土化的ChatGPT。 以百度为例&#xff0c;3月16日&#xff0c;百度推出新一代知识增强大语…