Java8 新特性 之 lambda 表达 和 函数式接口

news2024/10/7 15:26:19

—— lambda 表达式

概念

  • lambda 表达式是一个匿名函数,可以把 lambda 表达式理解为是一段可以传递的代码
  • 更简洁、更灵活,使 Java 的语言表达能力得到了提升
  • lambda 表达式是作为接口的实现类的对象(万事万物皆对象)

使用语法

  • 例:(o1,o2) -> Integer.compare(o1,o2)
  • ->:lambda 操作符 或 箭头操作符
  • -> 的左边:lambda 形参列表,对应着要重写的接口的抽象方法的形参列表
  • -> 的右边:lambda 体,对应着接口的实现类要重写的方法的方法体

语法格式

  • 无参,无返回值
        new Thread(() -> {
            System.out.println("hello");
        }).start();
  • 有一个参数,无返回值
        Consumer<Integer> a = (Integer integer) -> {
            System.out.println(integer);
        };
  • 数据类型可以省略
        Consumer<Integer> a = (integer) -> {
            System.out.println(integer);
        };
  • 只需要一个参数时,参数小括号可以省略
        Consumer<Integer> a = integer -> {
            System.out.println(integer);
        };
  • 需要两个及以上的参数,并且有返回值
        Comparator<Integer> comparator = (o1, o2) -> {
            return o1 - o2;
        };
  • 当只有一条语句时,return 和 大括号都有,则都可以省略
		Comparator<Integer> comparator = (o1, o2) -> o1 - o2;

—— 函数式接口

概念

  • 如果接口中只声明有一个抽象方法,则此接口就称为函数式接口
  • 只有给函数式接口提供实现了类的对象时,才可以使用 lambda 表达式
  • 注解:@FunctionalInterface Java8 后引入
  • 包路径:java.util.function

四大核心函数式接口

在这里插入图片描述

—— 方法引用 / 构造器引用

概念

  • 方法引用可以看做是基于 lambda 表达式的进一步刻画
  • 当需要提供一个函数式接口的实例时,我们可以使用 lambda 表达式提供此实例
    • 满足一定条件的情况下,可以使用方法引用 或 构造器引用替换 lambda 表达式
  • 方法引用作为了函数式接口的实例

使用语法

  • 格式:类(或者对象):: 方法名
  • 举例:Integer :: compare
Lists.newArrayList("a", "b", "c").forEach(System.out::println)

构造器引用

// 无参构造器
Supplier<User> userSupplier = User::new;

// 有参构造器
Function<Integer, User> userFunction = User::new;

—— Stream 流式计算

概念

  • Stream 是数据渠道,用于操作数据源(集合、数组)所生成的元素序列
  • Stream 是 Java8 中处理集合的关键抽象概念,它可以指定你希望对集合进行的操作,可以执行非常复杂的查找、过滤、和数据映射等操作
  • 使用 Stream API 对集合数据进行操作,类似于使用 SQL 执行的数据库查询

Stream 和 Collection 区别

  • Collection 是一种静态的内存数据结构,讲的是数据;而 Stream 是计算。前者面向内存,存储在内存中;后者面向 CPU,通过 CPU 实现计算
  • Stream 不会自己存储元素、不会改变源对象
  • Stream 操作是延迟执行。这意味着他们会等到需要结果的时候才执行。即一旦执行终止操作,这就执行中间操作链,并产生结果
  • Stream 一旦执行了终止操作,就不能再调用其他中间操作或终止操作了

操作

在这里插入图片描述

		PersonBo personBo1 = new PersonBo(1, "张三");
        PersonBo personBo2 = new PersonBo(2, "李四");
        PersonBo personBo3 = new PersonBo(3, "王五");
        PersonBo personBo4 = new PersonBo(4, "赵六");

        List<PersonBo> list = new ArrayList<>();
        list.add(personBo1);
        list.add(personBo2);
        list.add(personBo3);
        list.add(personBo4);

        // filter 过滤(返回还是对象)
        list.stream().filter(t -> {
            return t.getId() % 2 == 0;
        }).forEach(System.out::println);

        // match:anyMatch、allMatch、noneMatch 对流中的元素进行匹配
        boolean y = list.stream().anyMatch(personBo -> {
            return personBo.getName().contains("y");
        });

        // map 将集合中的元素类型,转换成另一种数据类型
        list.stream().map(PersonBo::getId).forEach(System.out::println);

        // sorted 根据字段属性进行排序
        list.stream().sorted((u1, u2) -> {
            return u2.getId().compareTo(u1.getId());
        }).map(PersonBo::getId).forEach(System.out::println);

        // limit限制数————collect将map单个映射转为list集合
        list.stream().map(t -> {
            return t.getId();
        }).limit(1).forEach(System.out::println);

        // distinct 对流中的元素进行去重
        list.stream().distinct().forEach(System.out::println);

        // partitioningBy 根据判断的值为true还是false分为两组
        Map<Boolean, List<PersonBo>> collect = list.stream().collect(Collectors.partitioningBy(personBo -> {
            return personBo.getId() > 3;
        }));

        // groupingBy 将数据分组成多个key的形式(即groupby分组)
        Map<Integer, List<PersonBo>> collect1 = list.stream().collect(Collectors.groupingBy(PersonBo::getId));

        // reduce 计算集合总数
        Integer sum = list.stream().map(PersonBo::getId).reduce(Integer::sum).get();
        System.out.println(sum);

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

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

相关文章

世界那么大,你哪都别去了,来我带你了解CSS3(三)

文章目录‍❤️‍&#x1f525;CSS动画‍❤️‍&#x1f525;CSS雪碧图‍❤️‍&#x1f525;CSS字体图标‍❤️‍&#x1f525;CSS盒子模型&#xff08;Box Model&#xff09;‍❤️‍&#x1f525;CSS新特性‍❤️‍&#x1f525;CSS动画 动画是使元素从一种样式逐渐变化为另…

【Rides】使用Xshell 链接云服务器安装Rides及其三种启动方法详解

文章目录一.NoSQL和SQl的概念1.1 总结二.Rides2.1 Rides特点2.2 Rides安装2.2.1 上传安装包并解压2.3 Redis启动&#xff08;前台启动不推荐&#xff09;2.4.指定配置启动2.5 开机自启三.Redis客户端2.1.Redis命令行客户端2.2.图形化桌面客户端2.2.1.安装2.2.2.建立连接一.NoSQ…

Vue.js 实现带拖动功能的时间轴

带拖动功能的时间轴timeline-slider-vueDemoGithub环境node V12.20.0npm 6.14.8&#x1f4e6; Installnpm install --save timeline-slider-vue全局引用main.jsimport TimelineSliderVue from timeline-slider-vueimport timeline-slider-vue/lib/timeline-slider-vue.cssVue.u…

数据库复习

什么是数据库系统 数据库系统是指在计算机系统中引入数据库后构成的系统&#xff0c;一般由数据库、数据库管理系统(及其开发工具)、应用系统、数据库管理员和用户构成 数据库系统的特点是什么&#xff1f; 数据结构化数据的共享性高&#xff0c;冗余度低且易扩充数据独立性高数…

吐血整理的TCP协议相关原理

文章目录一、 TCP报文的结构二、TCP建立连接-三次握手2.1 三次握手建立连接的过程2.2 三次握手的思考2.3 针对连接过程的DDOS攻击-SYN flood三、 TCP断开链接-四次挥手3.1 客户端主动断开链接的过程3.2 四次挥手的思考四、 TCP状态机六、 TCP的流量控制-滑动窗口协议七、 TCP拥…

openpnp - 顶部相机高级矫正的细节

文章目录openpnp - 顶部相机高级矫正的细节概述ENDopenpnp - 顶部相机高级矫正的细节 概述 设备到手的时候, 只有一个主校准点, 是一块只带一个mark点的小PCB拧在设备正面前部中间的凸台上. 配置openpnp时, 需要指定次校准点. 开始自己做了一块长条形PCB, 上面有mark点, 拧在…

【C++知识点】重载

✍个人博客&#xff1a;https://blog.csdn.net/Newin2020?spm1011.2415.3001.5343 &#x1f4da;专栏地址&#xff1a;C/C知识点 &#x1f4e3;专栏定位&#xff1a;整理一下 C 相关的知识点&#xff0c;供大家学习参考~ ❤️如果有收获的话&#xff0c;欢迎点赞&#x1f44d;…

阿赵的MaxScript学习笔记分享十二《获取和导出各种数据》

大家好&#xff0c;我是阿赵&#xff0c;周日的早上继续分享MaxScript学习笔记&#xff0c;这是第十二篇&#xff0c;获取和导出各种数据 1、导出数据的目的 使用3DsMax建立3D模型后&#xff0c;很多时候需要输出模型到别的引擎去使用&#xff0c;常用的格式有Obj、FBX、SLT等…

geoserver之BlobStores使用

概述 geoserver是常用的地图服务器之一&#xff0c;除了基本的能力之外&#xff0c;也提供了很多的插件方便大家使用。在本文&#xff0c;讲述一下如何在geoserver中使用BlobStores和gwc-sqlite-plugin插件实现地图的切片和部署。 BlobStores简介 在geoserver中&#xff0c;…

Linux安装Nginx和Nginx基础配置

下载Nginx 方式一&#xff1a;通过官网下载后上传 通过官网下载安装包。下载地址https://nginx.org/en/download.html 这里选择稳定版的进行下载。 这里使用FinalShell终端工具操作&#xff0c;使用其他工具操作亦可。FinalShell工具下载地址&#xff1a;http://www.hostbuf…

带加权的贝叶斯自举法 Weighted Bayesian Bootstrap

在去年的文章中我们介绍过Bayesian Bootstrap&#xff0c;今天我们来说说Weighted Bayesian Bootstrap Bayesian bootstrap 贝叶斯自举法&#xff08;Bayesian bootstrap&#xff09;是一种统计学方法&#xff0c;用于在缺乏先验知识的情况下对一个参数的分布进行估计。这种方…

【Node.js】HTTP协议、HTTP的请求报文和响应报文

HTTP协议、HTTP的请求报文和响应报文HTTP协议HTTP主要特点HTTP的请求报文和响应报文请求报文请求行请求消息头空行请求体响应报文响应状态行响应消息头空行响应体总结HTTP协议 HTTP 全称为超文本传输协议&#xff0c;是用于从WWW服务器传输超文本到本地浏览器的传送协议&#…

硬件基础专题-01电阻篇

目录 课程链接 学习目的 电阻 电阻理论讲解 电阻定义​ 欧姆定律​ 电阻单位换算 电阻选型考虑 安装方式 常见电阻值 各种贴片电阻的读取方式 确定电阻值的方法 电阻数据手册 电阻测量 电阻的产品应用​ 零欧姆电阻 热敏电阻 光敏电阻 课程链接 视频专辑 - 硬件…

linux入门---权限

目录标题什么是权限人的分类为什么会有所属组查看文件属性文件的分类如何查看权限文件不同权限的表现rwx权限修改八进制权限修改umask有关内容文件中人的修改目录不同权限的表现rwx什么是权限 首先来看一个例子&#xff1a;比如说我没有爱奇艺的vip&#xff0c;那么我也就没有…

训练CV模型常用的方法与技巧

最近参加一个CV比赛&#xff0c;看到有参赛者分享了自己训练图像识别模型时常用到的小技巧&#xff0c;故对其进行记录、整理&#xff0c;方便未来继续学习。整理了很多&#xff0c;它们不一定每次有用&#xff0c;但请记在心中&#xff0c;说不定未来某个任务它们就发挥了作用…

JavaScript-扫盲

文章目录1. 前言2. 第一个 JavaScript 程序3. javaScript 的基础语法3.1 变量3.2 数据类型3.3 运算符3.4 条件语句3.5 数组3.6 函数3.7 作用域3.8 对象4. WebAPI4.1 DOM 基本概念4.2 常用 DOM API4.3 事件4.4 操作元素4.5 网页版猜数字游戏4.6 留言版1. 前言 提问 java 和 java…

数字图像学笔记 —— 17. 图像退化与复原(自适应滤波之「最小二乘方滤波」)

文章目录维纳滤波的缺点约束最小二乘方滤波给一个实际例子吧维纳滤波的缺点 维纳滤波&#xff08;Wiener Filter&#xff09;&#xff0c;虽然是一种非常强大的退化图像还原算法&#xff0c;但是从实验过程我们也发现它存在着致命的缺陷&#xff0c;那就是要求输入退化系统的 …

医疗器械之模糊算法(嵌入式部分)

模糊控制 所谓模糊控制&#xff0c;就是对难以用已有规律描述的复杂系统&#xff0c;采用自然语言&#xff08;如大&#xff0c;中&#xff0c;小&#xff09;加以描述&#xff0c;借助定性的&#xff0c;不精确的以及模糊的条件语句来表达&#xff0c;模糊控制是一种基于语言的…

Java虚拟机JVM-运行时数据区域说明

及时编译器 HotSpot虚拟机中含有两个即时编译器&#xff0c;分别是编译耗时短但输出代码优化程度较低的客户端编译器&#xff08;简称为C1&#xff09;以及编译耗时长但输出代码优化质量也更高的服务端编译器&#xff08;简称为C2&#xff09;&#xff0c;通常它们会在分层编译…

【Linux】手把手教你在CentOS上使用docker 安装MySQL8.0

文章目录前言一. docker的安装1.1 从阿里下载repo镜像1.2 安装docker1.3 启动docker并查看版本二. 使用docker安装MySQL8.02.1 拉取MySQL镜像2.2 创建容器2.3 操作MySQL容器2.4 远程登录测试总结前言 大家好&#xff0c;又见面了&#xff0c;我是沐风晓月&#xff0c;本文主要…