当前位置: 首页 > news >正文

函数式编程Stream流(通俗易懂!!!)

目录

1.Lambda表达式

1.1 基本用法

1.2 省略规则

2.Stream流

2.1 常规操作 

2.1.1 创建流

2.1.2 中间操作

filter

map 

distinct

sorted 

limit

​编辑skip 

flatMap

 2.1.3 终结操作

foreach

count

max&min 

collect 

anyMatch

allMatch 

noneMatch

​编辑

findAny

findFirst 

reduce归并

​编辑2.2注意事项 

3.Optional

3.1 概述

3.2 使用

3.2.1 创建对象

3.2.2 安全消费值

 3.2.3 获取值

​编辑 3.2.4 过滤

​编辑3.2.5 判断

​编辑3.2.6 数据转换 

4.函数式接口

4.1 概述

4.2 常见函数式接口

4.3 常见的默认方法

​编辑5.方法引用 

5.1.1 引用类的静态方法

5.1.2 引用对象的实例方法

6.高级用法

基本数据类型优化

​编辑并行流 


重点:只关注传入的参数列表和方法体(数据+操作) 

1.Lambda表达式

本质是匿名内部类的优化,先写匿名内部类

1.1 基本用法
public class lambdaTest {public static void main(String[] args) {
//        int i = calculateNum((int left, int right) -> {
//            return left + right;
//        });
//        System.out.println(i);
//
//        printNum((int value) -> {
//            return value % 2 ==0;
//        });
//
//        Integer i1 = typeConver((String s)->{
//            return Integer.valueOf(s);
//        });
//        System.out.println(i1);foreachArr((int value) -> {System.out.println(value);});}public static void foreachArr(IntConsumer consumer){int [] arr = {1,2,3,4,5,6,7,8,9,10};for (int i : arr) {consumer.accept(i);}}public static <R> R typeConver(Function<String,R> function){String str = "1235";R result = function.apply(str);return result;}public static void printNum(IntPredicate predicate){int [] arr = {1,2,3,4,5,6,7,8,9,10};for (int i : arr) {if(predicate.test(i)){System.out.println(i);}}}public static int calculateNum(IntBinaryOperator operator){int a = 10;int b = 20;return operator.applyAsInt(a,b);}
}
1.2 省略规则
  • 参数类型可以省略
  • 方法体只有一句代码时大括号return和唯一一句代码的分号可以省略
  • 方法只有一个参数时小括号可以省略
  • 以上规则都记不住也可以省略不记‘

2.Stream流

 List<Object> array = new ArrayList<>();array.stream() //把集合转换成流.distinct() //去重.filter(author -> author.getAge() < 18) //过滤年龄小于18的作者.forEach(author -> System.out.println(author.getName())); //打印作者姓名
2.1 常规操作 
2.1.1 创建流

2.1.2 中间操作
filter
  • 可以对流中的元素进行条件过滤

map 
  • 可以把对流中的元素进行计算或转换

distinct
  • 可以去除流中的重复元素 

sorted 
  • 可以对流中的元素进行排序

limit
  • 可以设置流的最大长度,超出的部分将被抛弃
skip 
  • 跳过流中的前n个元素,返回剩下的元素

flatMap
  •  map只能把一个对象转换另一个对象作为流中的元素。而flatMap可以把一个对象转换成多个对象作为流中的元素

 2.1.3 终结操作
foreach
count
  • 可以用来获取当前流中元素的个数

max&min 
  • 可以用来获取流中的最大&最小值

collect 
  • 把当前流转成一个集合

anyMatch
  • 可以用来判断是否有任意符合匹配条件的元素,结果为boolean类型 

allMatch 
  • 可以用来判断是否都符合匹配条件

noneMatch
findAny
  • 查找任意元素

findFirst 

reduce归并
  • 对流中的数据按照你指定的计算方式计算出一个结果(缩减操作)
  • reduce的作用是把stream的元素给组合起来,我们可以传入一个初始值,它会按照我们的计算方式依次拿流中的元素和在初始化值的基础上进行计算,计算结果再和后面的元素计算
2.2注意事项 
  • 惰性求值(如果没有终结操作,)
  • 流是一次性的(一旦一个流对象经过一个终结操作后,这个不能再被使用)
  • 不会影响原数据

3.Optional

3.1 概述

我们在编写代码的时候出现最多的就是空指针异常。所以在很多情况下我们需要做各种非空的判断。

3.2 使用
3.2.1 创建对象

Optional就好像是包装类,可以把我们的具体数据封装Optional对象内部。然后我们去使用Optional中封装好的方法操作封装进去的数据就可以避免空指针异常。

3.2.2 安全消费值

 3.2.3 获取值

不推荐使用

 3.2.4 过滤
3.2.5 判断
3.2.6 数据转换 

4.函数式接口

4.1 概述

只有一个抽象方法的接口我们称之为函数式接口

JDK的函数式接口都加上了@Functionallnterface注解进行标识。

4.2 常见函数式接口
  • Consumer消费接口
  • Function计算转换接口
  • Predicate判断接口
  • Supplier生产型接口
4.3 常见的默认方法
  • and

  • or

  • negate

5.方法引用 

推荐用法:快捷键

我们在使用lambda时,如果方法体只有一个方法的调用的话(包括构造方法)。可以使用方法引用

类名或者对象名:方法名

5.1 语法详解

5.1.1 引用类的静态方法

格式:类名::方法名

5.1.2 引用对象的实例方法

6.高级用法

基本数据类型优化
并行流 

相关文章:

函数式编程Stream流(通俗易懂!!!)

目录 1.Lambda表达式 1.1 基本用法 1.2 省略规则 2.Stream流 2.1 常规操作 2.1.1 创建流 2.1.2 中间操作 filter map distinct sorted limit ​编辑skip flatMap 2.1.3 终结操作 foreach count max&min collect anyMatch allMatch noneMatch …...

数据分析:转录组差异fgsea富集分析

文章目录 介绍加载R包数据链接导入数据数据预处理DE testing: 2BP vs no-BP比较limma-voomLoad steroid dataIn No-BP patientsIn 2BP patientsCompare gene expression vs bacterial mass其他系统信息介绍 转录组差异fgsea富集分析是一种基于基因集的富集分析方法,它关注的是…...

在Django中安装、配置、使用CKEditor5,并将CKEditor5录入的文章展现出来,实现一个简单博客网站的功能

在Django中可以使用CKEditor4和CKEditor5两个版本&#xff0c;分别对应软件包django-ckeditor和django-ckeditor-5。原来使用的是CKEditor4&#xff0c;python manager.py makemigrations时总是提示CKEditor4有安全风险&#xff0c;建议升级到CKEditor5。故卸载了CKEditor4&…...

AI笔筒操作说明及应用场景

AI笔筒由来&#xff1a; 在快节奏的现代办公环境中&#xff0c;我们一直在寻找既能提升效率、增添便利&#xff0c;又能融入企业文化、展现个人品味的桌面伙伴。为此&#xff0c;我们特推出专为追求卓越、注重细节的您设计的AI笔筒礼品版&#xff0c;它集高科技与实用性于一身…...

Android自启动管控

1. 自启动管控需求来源 自启动、关联启动、交叉启动、推送启动等现象的泛滥除了对个人信息保护带来隐患外&#xff0c;还会导致占用过多的系统CPU和内存资源&#xff0c;造成系统卡顿、发热、电池消耗过快&#xff1b;还可能引入一些包含“恶意代码”的进程在后台隐蔽启动&…...

把握鸿蒙生态崛起的机遇:开发者视角的探讨

​ 大家好&#xff0c;我是程序员小羊&#xff01; 前言&#xff1a; 近年来&#xff0c;鸿蒙系统&#xff08;HarmonyOS&#xff09;的发展备受瞩目。随着其在智能手机、智能穿戴、车载系统和智能家居等领域的广泛应用&#xff0c;鸿蒙系统正逐渐形成与安卓、iOS并列的三足鼎立…...

MySQL初学之旅(1)配置与基础操作

目录 1.前言 2.正文 2.1数据库的发展历程 2.2数据库的基础操作 2.2.1启动服务 2.2.2创建与删除数据库 2.2.3数据类型 2.2.4创建表与删除表 2.3MySQL Workbench基础使用简介 3.小结 1.前言 哈喽大家好吖&#xff0c;今天博主正式开始为大家分享数据库的学习&#xff…...

一款革命性的视频剪辑工具,AI剪辑新纪元:Clapper

如果说AI视频剪辑工具哪家强&#xff1f;还真想不出有什么让人眼前一亮的AI视频剪辑应用。 毕竟随着AI技术的发展越来越快&#xff0c;各种AI应用如雨后春笋般涌现&#xff0c;然而&#xff0c;真正能够在视频剪辑领域脱颖而出的工具却寥寥无几。 今天我要介绍的 Clapper 就是…...

HTML 区块

HTML 区块 HTML&#xff08;HyperText Markup Language&#xff09;是构建网页的标准语言&#xff0c;它定义了网页的结构和内容。在HTML中&#xff0c;区块元素是指那些能够定义较大块状结构的元素&#xff0c;比如段落、标题、列表、表格和 divis 等。这些元素通常对页面的布…...

复杂度的讲解

数据结构可以简单理解为在内存中管理数据 它具有速度快 带电存储的特点&#xff08;临时存储&#xff09; 如何衡量一个算法的好坏 因此衡量一个算法的好坏&#xff0c;一般是从时间和空间两个维度来衡量的&#xff0c;即时间复杂度和空间复杂度。 时间复杂度主要衡量一个算…...

[ Linux 命令基础 2 ] Linux 命令详解-系统管理命令

&#x1f36c; 博主介绍 &#x1f468;‍&#x1f393; 博主介绍&#xff1a;大家好&#xff0c;我是 _PowerShell &#xff0c;很高兴认识大家~ ✨主攻领域&#xff1a;【渗透领域】【数据通信】 【通讯安全】 【web安全】【面试分析】 &#x1f389;点赞➕评论➕收藏 养成习…...

使用docker部署Prometheus和Grafana去监控mysql和redis

自动化性能监控系统安装部署 相关工具的安装部署 服务工具分配 服务器工具端口10.0.20.9grafana300010.0.20.9prometheus909010.0.20.10mysql330610.0.20.10mysql-exporter910410.0.20.10redis330610.0.20.10redis_exporter9121 使用docker-compose安装prometheus 先拉取p…...

日志管理 | Log360 实现PCI DSS v4.0数据安全合规要求

PCI DSS 是一项网络安全标准&#xff0c;得到所有主要信用卡和支付处理公司的支持&#xff0c;旨在确保信用卡和借记卡号码的安全。最新的PCI DSS v4.0 代表支付卡行业数据安全标准。 任何依赖信用卡交易的企业都不能将数字安全视为一个偷工减料的领域&#xff0c;因为数据泄露…...

JAVA中的string和stringbuffer

【之前面试测试岗位的时候有被问到这个问题&#xff0c;面试结束后特地来学习一下】 目录 谁先被提出的String的使用StringBuffer的使用两者区别 谁先被提出的 String类先于StringBuffer被提出&#xff0c;作为Java语言的基础部分&#xff0c;而StringBuffer是为了解决实际开…...

轻型民用无人驾驶航空器安全操控------理论考试多旋翼部分笔记

官网&#xff1a;民用无人驾驶航空器综合管理平台 (caac.gov.cn) 说明&#xff1a;一是法规部分&#xff1b;二是多旋翼部分 本笔记全部来源于轻型民用无人驾驶航空器安全操控视频讲解平台 目录 官网&#xff1a;民用无人驾驶航空器综合管理平台 (caac.gov.cn) 一、轻型民用无人…...

计算用户订购率梧桐数据库和oracle数据库sql分析

一、背景说明 移动运营商平台提供多种类型的产品权益&#xff0c;用户可以通过订购来使用。平台需要定期统计各个产品的用户订购情况&#xff0c;以便了解各个产品的受欢迎程度。这些统计数据将用于优化产品、提升用户体验和制定市场推广策略。 二、表结构说明 梧桐数据库建…...

通过DNS服务器架构解释DNS请求过程

在前面的章节,这里,基于PCAP数据包和RFC文档详细介绍了DNS请求和响应的每个字段的含义。但是在现实的网络世界中,DNS请求和响应的数据包是怎么流动的,会经过哪些设备。本文将着重说明一下目前网络空间中DNS请求和响应的流动过程。 当前网络空间中比较常见DNS请求的流程如下…...

OKG Research:用户意图驱动的Web3应用变革

出品&#xff5c; OKG Research 作者&#xff5c;Samuel QIN 当前加密市场的快速演变中&#xff0c;用户增长成为行业可持续发展的基石。目前主流观点在推动行业前进的路上&#xff0c;从单纯的技术探索在向更注重应用价值的方向转变。尽管近年来Web3生态系统发展迅速&#xf…...

hbase 工具类

hbase 工具类 pom.xml <dependency><groupId>org.apache.hbase</groupId><artifactId>hbase-client</artifactId><version>2.5.10-hadoop3</version> </dependency> <dependency><groupId>com.google.guava<…...

会议直击|美格智能受邀出席第三届无锡智能网联汽车生态大会,共筑汽车产业新质生产力

11月10日&#xff0c;2024世界物联网博览会分论坛——第三届无锡智能网联汽车生态大会在无锡举行&#xff0c;美格智能CEO杜国彬受邀出席&#xff0c;并参与“中央域控&#xff1a;重塑汽车智能架构的未来”主题圆桌论坛讨论&#xff0c;与行业伙伴共同探讨智能网联汽车产业领域…...

测试微信模版消息推送

进入“开发接口管理”--“公众平台测试账号”&#xff0c;无需申请公众账号、可在测试账号中体验并测试微信公众平台所有高级接口。 获取access_token: 自定义模版消息&#xff1a; 关注测试号&#xff1a;扫二维码关注测试号。 发送模版消息&#xff1a; import requests da…...

解锁数据库简洁之道:FastAPI与SQLModel实战指南

在构建现代Web应用程序时&#xff0c;与数据库的交互无疑是核心环节。虽然传统的数据库操作方式&#xff08;如直接编写SQL语句与psycopg2交互&#xff09;赋予了我们精细的控制权&#xff0c;但在面对日益复杂的业务逻辑和快速迭代的需求时&#xff0c;这种方式的开发效率和可…...

YSYX学习记录(八)

C语言&#xff0c;练习0&#xff1a; 先创建一个文件夹&#xff0c;我用的是物理机&#xff1a; 安装build-essential 练习1&#xff1a; 我注释掉了 #include <stdio.h> 出现下面错误 在你的文本编辑器中打开ex1文件&#xff0c;随机修改或删除一部分&#xff0c;之后…...

华为OD机试-食堂供餐-二分法

import java.util.Arrays; import java.util.Scanner;public class DemoTest3 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseint a in.nextIn…...

从零实现STL哈希容器:unordered_map/unordered_set封装详解

本篇文章是对C学习的STL哈希容器自主实现部分的学习分享 希望也能为你带来些帮助~ 那咱们废话不多说&#xff0c;直接开始吧&#xff01; 一、源码结构分析 1. SGISTL30实现剖析 // hash_set核心结构 template <class Value, class HashFcn, ...> class hash_set {ty…...

Python如何给视频添加音频和字幕

在Python中&#xff0c;给视频添加音频和字幕可以使用电影文件处理库MoviePy和字幕处理库Subtitles。下面将详细介绍如何使用这些库来实现视频的音频和字幕添加&#xff0c;包括必要的代码示例和详细解释。 环境准备 在开始之前&#xff0c;需要安装以下Python库&#xff1a;…...

c#开发AI模型对话

AI模型 前面已经介绍了一般AI模型本地部署&#xff0c;直接调用现成的模型数据。这里主要讲述讲接口集成到我们自己的程序中使用方式。 微软提供了ML.NET来开发和使用AI模型&#xff0c;但是目前国内可能使用不多&#xff0c;至少实践例子很少看见。开发训练模型就不介绍了&am…...

Java多线程实现之Thread类深度解析

Java多线程实现之Thread类深度解析 一、多线程基础概念1.1 什么是线程1.2 多线程的优势1.3 Java多线程模型 二、Thread类的基本结构与构造函数2.1 Thread类的继承关系2.2 构造函数 三、创建和启动线程3.1 继承Thread类创建线程3.2 实现Runnable接口创建线程 四、Thread类的核心…...

GC1808高性能24位立体声音频ADC芯片解析

1. 芯片概述 GC1808是一款24位立体声音频模数转换器&#xff08;ADC&#xff09;&#xff0c;支持8kHz~96kHz采样率&#xff0c;集成Δ-Σ调制器、数字抗混叠滤波器和高通滤波器&#xff0c;适用于高保真音频采集场景。 2. 核心特性 高精度&#xff1a;24位分辨率&#xff0c…...

Java线上CPU飙高问题排查全指南

一、引言 在Java应用的线上运行环境中&#xff0c;CPU飙高是一个常见且棘手的性能问题。当系统出现CPU飙高时&#xff0c;通常会导致应用响应缓慢&#xff0c;甚至服务不可用&#xff0c;严重影响用户体验和业务运行。因此&#xff0c;掌握一套科学有效的CPU飙高问题排查方法&…...