Java8特性之Lambda表达式

news2024/9/22 6:51:09

1.概念

lambda表达式是Java8的一个新特性,从本质上来讲是一个匿名函数可以使用这个匿名函数实现接口中的方法,并且非常简洁。

通常来讲,使用 lambda表达式 是为了简化接口实现的。关于接口实现,可以有很多种方式来实现。例如L设计接口的实现类、使用匿名内部类。但是lambda表达式比这两种方式都简单。

2.Lambda表达式对接口的要求

并不是所有的接口都可以使用lambda表达式来简洁实现的。lambda表达式毕竟只是一个匿名方法。当实现的接口中的方法过多或者过少的时候,lambda表达式都是不适用的。

lambda表达式只能实现函数式接口。即一个接口中,要求实现类必须实现的抽象方法,有且只有一个,这样的接口就是函数式接口。

3.Lambda表达式的语法

(参数)->{方法体}
  • 参数部分︰方法的参数列表,要求和实现的接口中的方法参数部分一致,包括参数的数量和类型
  • 方法体部分∶方法的实现部分,如果接口中定义的方法有返回值,则在实现的时候,注意返回值的返回。
  • ->:分隔参数部分和方法体部分。 

  • 因为接口中规定了方法参数类型,所以实际写lambda表达式的时候可以省略 参数类型。如果只有一个参数,可以省略()
  • 另外如果方法体里只有一个语句,那么可以省略掉 {},如果该语句是return语句,需要把return也省略掉

省略如下:

4.函数引用

lambda表达式是为了简化接口的实现的。在lambda表达式中,不应该出现比较复杂的逻辑。如果在lambda表达式中出现了过于复杂的逻辑,会对程序的可读性造成非常大的影响。

如果在lambda表达式中需要处理的逻辑比较复杂,一般情况会单独的写一个方法。在lambda表达式中直接引用这个方法即可。或者,在有些情况下,我们需要在lambda表达式中实现的逻辑,在另外一个地方已经写好了。此时我们就不需要再单独写一遍,只需要直接引用这个已经存在的方法即可。

函数引用:引用一个已经存在的方法,使其替代lambda表达式完成接口的实现。

4.1引用一个静态方法

接口依然是上面的MultipleParametersReturn,引用如下 

需要注意的是引用的 方法的参数返回值类型 要与 接口 对应

4.2引用一个非静态方法

4.3引用构造方法 

Person类

public class Person {
    private Integer age;
    private String name;

    public Person() {
    }

    public Person(Integer age) {
        this.age = age;
    }

    public Person(Integer age, String name) {
        this.age = age;
        this.name = name;
    }

    @Override
    public String toString() {
        return "Person{" +
                "age=" + age +
                ", name='" + name + '\'' +
                '}';
    }
}

PersonWithNoParam接口

@FunctionalInterface
public interface PersonWithNoParam {
    Person getPersonWithNoParam();
}

PersonWithOneParam接口

@FunctionalInterface
public interface PersonWithOneParam {
    Person getPersonWithOneParam(Integer age);
}

PersonWithDoubleParams接口

@FunctionalInterface
public interface PersonWithDoubleParams {
    Person getPersonWithDoubleParams(Integer age,String name);
}

Demo

public class Demo1 {
    public static void main(String[] args) {
        //lambda表达式实现PersonWithNoParam接口
        PersonWithNoParam t1=Person::new;//无参构造函数引用
        System.out.println(t1.getPersonWithNoParam());

        //lambda表达式实现PersonWithOneParam接口
        PersonWithOneParam t2=Person::new;//单参构造函数引用
        System.out.println(t2.getPersonWithOneParam(10));

        //lambda表达式实现PersonWithDoubleParams接口
        PersonWithDoubleParams t3=Person::new;//多参构造函数引用
        System.out.println(t3.getPersonWithDoubleParams(10,"小王"));

    }

}

lambda表达式会自动根据 方法的参数类型 匹配Person类中对应的构造方法

5.特殊的函数引用

如果在使用lambda表达式实现某些接口的时候,lambda表达式的参数列表中包含了某一个对象,此时方法体中,直接使用这个对象调用它的某一个方法就可以完成整体的逻辑并且其他的参数可以作为调用方法的参数。此时,可以对这种实现进行简化。

Person类

public class Person {
    private Integer age;
    private String name;

    public Person() {
    }

    public Person(Integer age) {
        this.age = age;
    }

    public Person(Integer age, String name) {
        this.age = age;
        this.name = name;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "Person{" +
                "age=" + age +
                ", name='" + name + '\'' +
                '}';
    }
}

PersonSpecial接口

public interface PersonSpecial {
    void setAge (Person person,Integer age);
}

Demo2

public class Demo2 {
    public static void main(String[] args) {
        //简化前
        PersonSpecial t=(person,age)->person.setAge(age);
        //用对象的特殊引用简化后
        PersonSpecial t2=Person::setAge;
        Person person = new Person();
        t2.setAge(person,13);
        System.out.println(person);
    }
}

6.闭包

如果某一个局部变量被用在了某一个代码块中,这其实就形成了对这个局部变量的包围,我们称"闭包"。这个时候这个变量不允许被改变,即final

如下编译器会报错:

如果使用的是全局变量则不会出现闭包问题 

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

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

相关文章

MongoDB多字段重复数据的查询与删除

MongoDB的语法平时接触的不错,更多的是使用关系型数据库。最近遇到一个问题,在MongoDB中,需要找出三个字段重复的数据,有点类似于SQL数据中的三个字段组成的唯一键。并且需要将重复的数据保留一条,其余删除。但是在Mon…

跌倒检测和识别3:Android实现跌倒检测(含源码,可实时跌倒检测)

跌倒检测和识别3:Android实现跌倒检测(含源码,可实时跌倒检测) 目录 跌倒检测和识别3:Android实现跌倒检测(含源码,可实时跌倒检测) 1. 前言 2. 跌倒检测数据集说明 3. 基于YOLOv5的跌倒检测模型训练 4.跌倒检测模型Android…

Kubernetes----Pod,资源对象文件

kubectl容器管理 kubectl用于控制Kubernetes集群的命令行工具 语法格式 kubectl [command] [type] [name] [flages] command: 子命令,如create,get,describe,delete type: 资源类型,可以表示为单数,复数形式或缩写形式 name: 资…

2023年4月份上新的图像领域分割模型设计系列论文(一)

来源:投稿 作者:王老师 编辑:学姐 论文1 论文标题: Learning Semantic-Aware Knowledge Guidance for Low-Light Image Enhancement 论文链接: https://arxiv.org/pdf/2304.07039v1.pdf代码链接: https://…

Java性能优化之序列化优化

1、Java 序列化及其缺陷 Java 提供了一种序列化机制,这种机制能够将一个对象序列化为二进制形式(字节数组),用于写入磁盘或输出到网络,同时也能从网络或磁盘中读取字节数组,反序列化成对象,在程…

无法启动此程序,因为计算机中丢失VCRUNTIME140.dll”错误的解决办法

vcruntime140.dll是什么什么文件呢?为什么电脑在运行一些游戏或许软件的时候会出现丢失vcruntime140.dll,然后游戏或许软件运行失败?这个dll文件是电脑重要的运行库文件。丢失了会导致很多程序无法运行。 首先打开电脑浏览器以后在顶部网页栏目输入&am…

MATLAB实现图像滤波及噪声消除

图像增强是指根据特定的需要突出一幅图像中的某些信息,同时削弱或去除某些不需要的信息的处理方法。其主要目的是使处理后的图像对某种特定的应用来说,比原始图像更适用。因此,这类处理是为了某种应用目的而去改善图像质量的。处理的结果使图…

ROS学习第三十六节——Gazebo仿真环境搭建

https://download.csdn.net/download/qq_45685327/87719408 1.直接添加现成模型 1.1加入环境模型 在工程文件中创建worlds文件夹&#xff0c;并把之前下载的box_house.world文件放入 1.2编写launch文件 deamo03_car_world.launch <launch><!-- 将 Urdf 文件的内容…

CCGNet用于发现共晶材料中的coformer

共晶工程&#xff08;cocrystal engineering&#xff09;在制药&#xff0c;化学和材料领域有广泛应用。然而&#xff0c;如何有效选择coformer一直是一个挑战性课题。因此&#xff0c;作者开发了一个基于GNN的深度学习框架用于快速预测共晶的形成。为了从现有报告的6819个正样…

超详细Redis入门教程——Redis命令(下)

前言 本文小新为大家带来 超详细Redis入门教程——Redis命令 相关知识&#xff0c;具体内容包括简单动态字符串 SDS&#xff0c;集合的底层实现原理&#xff0c;BitMap 操作命令&#xff0c;HyperLogLog 操作命令&#xff0c;Geospatial 操作命令&#xff0c;发布/订阅命令&…

2023.04.23 学习周报

文章目录 摘要文献阅读1.题目2.摘要3.介绍4.模型4.1 研究区域4.2 自相关分析4.3 LSTM 5.实验与讨论5.1 高架道路不同位置空气污染物的变化5.2 高架道路不同位置空气污染物的相关性5.3 高架道路不同位置空气污染物预测 6.结论7.展望 度规张量1.曲率2.度量张量3.代码实现4.平行四…

基于遗传算法的梯级水电站群优化调度研究(Matlab代码实现)

&#x1f4a5; &#x1f4a5; &#x1f49e; &#x1f49e; 欢迎来到本博客 ❤️ ❤️ &#x1f4a5; &#x1f4a5; &#x1f3c6; 博主优势&#xff1a; &#x1f31e; &#x1f31e; &#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 …

王道计组(23版)7_I/O系统

I/O控制方式 数据传输率低的外设&#xff1a; 程序查询方式 程序中断方式&#xff1a;外设准备就绪则主动向CPU发送中断请求 数据传输率高的外设&#xff1a; DMA方式&#xff1a;主存和I/O设备有一条直接数据通路&#xff0c;无需调用中断 通道方式&#xff1a;每个通道挂接若…

CTFSHOW web入门——web30

代码审计 把flag、system、php都给过滤了 passthru()函数同system()函数类似&#xff0c;都可以用来执行外部命令的&#xff0c;因此可以用passthru来代替system。 因此构造payload&#xff1a;?cpassthru(cat f*); 查看页面源代码即可获得flag

ROS学习第三十四节——URDF与Gazebo基本集成流程

https://download.csdn.net/download/qq_45685327/87718593 1.创建功能包 创建新功能包&#xff0c;导入依赖包: urdf xacro gazebo_ros gazebo_ros_control gazebo_plugins 2.编写URDF文件 demo01_helloworld.urdf <robot name"mycar"><link name"…

Android 一个获取网址时间的Demo

Android 一个获取网址时间的Demo 文章目录 Android 一个获取网址时间的Demo通过一个网址获取时间的代码关于Android NTP 时间Android 同步时间代码 前段时间有个客户想用局域网同步Android 设备的时间&#xff0c;开发后把这个demo分享一下。 效果&#xff1a; 这里也获取了阿…

Xshell中的基本命令

whoami 当我们刚登录上Xshell的时候&#xff0c;我们应该做什么呢&#xff1f;&#xff1f; 我们上次说了如何增加使用者&#xff0c;和删除使用者&#xff0c;今天我们说一下其他的基本命令。 我们刚开始登录的时候可以用root登录 那么我们怎么看自己事谁呢&#xff1f; …

C/C++占位符,%x和%p的区别

遇到的问题 今天遇到了一个很奇怪的问题&#xff0c;当使用malloc分配了一个堆空间后&#xff0c;分别尝试用cout和printf尝试打印该地址&#xff0c;出现了两个地址不一样的情况&#xff1a; int *pp (int*)malloc(10*sizeof(int)); *pp 1234; cout << pp << …

35. 搜索插入位置 58. 最后一个单词的长度

目录 35. 搜索插入位置 思路 代码 58. 最后一个单词的长度 思路1 代码1 思路2 代码2 35. 搜索插入位置 给定一个排序数组和一个目标值&#xff0c;在数组中找到目标值&#xff0c;并返回其索引。如果目标值不存在于数组中&#xff0c;返回它将会被按顺序插入的位置。…

存钱罐出口欧盟CE认证ROHS标准测试

近年来生活水平提高&#xff0c;人们手头上的余钱也多了起来&#xff0c;家长们通常会给小孩子买存钱罐&#xff0c;培养小孩子的理财能力&#xff0c;养成良好的财富观&#xff0c;一般的存钱罐都被设计用来存放硬币&#xff0c;一般分为陶瓷&#xff0c;塑料和金属。上端有缝…