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

Java8之Stream操作

Java8之Stream操作

  • stream干啥用的?
  • 创建流
  • 中间操作
  • 终结操作
  • 好文推荐----接口优化思想

stream干啥用的?

Stream 就是操作数据用的。使用起来很方便
创建流 → 中间操作 → 终结操作

在这里插入图片描述

Stream的操作可以分为两大类:中间操作、终结操作

中间操作可分为:

  1. 无状态(Stateless)操作:指元素的处理不受之前元素的影响
  2. 有状态(Stateful)操作:指该操作只有拿到所有元素之后才能继续下去

终结操作可分为:

  1. 短路(Short-circuiting)操作:指遇到某些符合条件的元素就可以得到最终结果
  2. 非短路(Unshort-circuiting)操作:指必须处理完所有元素才能得到最终结果

创建流

  1. 单列集合
    通过 .stream() 方法即可。
   // 例如:List<Person> personList = new ArrayList<>();// 创建流Stream pstream = personList.stream();
  1. 双列集合
    转成单列集合再创建流
	//例如:Map<String,Integer> map = new HashMap<>();map.entrySet()  //转成与List一样的单列集合,只是取值不一样。.stream()  

中间操作

  1. filter 过滤
		List<Person> personList = new ArrayList<>();personList.add(new Person(10,"flx"));personList.add(new Person(11,"flx"));personList.add(new Person(12,"cxy"));personList.add(new Person(13,"cxy"));personList.add(new Person(10,"flx"));//filter操作----过滤。比如过滤出年龄大于10的人。personList.stream().filter(person -> person.age>10).forEach(person -> System.out.println(person.getName()));
  1. map 对整体流的操作
        //最常用的操作是取某一些值personList.stream().map(person -> person.getName()).forEach(name -> System.out.println(name));// 计算的话,一般用不到personList.stream().map(person -> person.age = person.age+10).forEach(person -> System.out.println(person));
  1. flatMap 扁平化List。重点是扁平化对象中有List的数据,且要返回流数据
        Friend friend1 = new Friend("张三");Friend friend2 = new Friend("李四");Friend friend3 = new Friend("王五");List<Friend> friends = new ArrayList<>();friends.add(friend1);friends.add(friend2);friends.add(friend3);List<Person> personList2 = new ArrayList<>();personList2.add(new Person(10,"flx",friends));personList2.add(new Person(11,"cxy",friends));personList2.stream().flatMap(person -> person.getFriendList().stream()).forEach(friend -> System.out.println(friend.getName()));
  1. distinct 去重。重点是需要重写对象中equals()方法
        // distinct操作----去重。personList.stream().distinct().forEach(person -> System.out.println(person.getName()));
  1. sorted 排序。重点是对象需要实现Comparable接口
        // sorted操作----排序。personList.stream().sorted().forEach(person -> System.out.println(person.getAge()));
  1. limitskip。limit是截取前n个元素。skip是跳过前n个,剩下的截取
        // limit操作----截取。personList.stream().limit(2).forEach(person -> System.out.println(person.getAge()));// skip操作----跳过并截取personList.stream().skip(2).forEach(person -> System.out.println(person.getAge()));

终结操作

  1. collect 转成集合
  2. forEach 遍历
  3. countmaxmin 统计、最大、最小
        long count = personList.stream().flatMap(person -> person.getFriendList().stream()).count();System.out.println(count);Optional<Integer> max = personList.stream().map(person -> person.getAge()).max((o1,o2) -> o1-o2);System.out.println(max.get());
  1. anyMatchallMatch
        // anyMatch 只要有一个匹配,就返回true// allMatch 所有都匹配,才返回trueBoolean b = personList.stream().anyMatch(person -> person.getAge()>10);System.out.println(b);
  1. findAnyfindFirst
        // findAny 查找任意一个满足条件的元素// findFirst 查找满足条件元素的第一个Optional<Person> first = personList.stream().filter(person -> person.getAge() > 10).findFirst();first.ifPresent(person -> System.out.println(person.getName()));
  1. reduce 一般会先map一下,再执行reduce ( 我们熟悉的mapReduce()操作 )
        // reduce(params1,params2)// params1:初始化的第一个值// params2: 要执行的操作。// 里面有两个参数  result、element// result 每一步返回的结果// element 当前的元素// 例如,计算所有的年龄的和Integer reduce = personList.stream().map(person -> person.getAge()).reduce(0, (result, element) -> result = result + element);System.out.println(reduce);

中间操作常用的是 filter、map、flatmap
终结操作常用的是foreach、collect、reduce

整体代码示例

package com.face;import lombok.val;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;import java.util.ArrayList;
import java.util.List;
import java.util.Optional;@SpringBootTest
class FaceEasyApplicationTests {@Testvoid contextLoads() {}/** 中间操作* */@Testvoid testStreamMiddle() {List<Person> personList = new ArrayList<>();personList.add(new Person(10,"flx"));personList.add(new Person(11,"flx"));personList.add(new Person(12,"cxy"));personList.add(new Person(13,"cxy"));personList.add(new Person(10,"flx"));//filter操作----过滤。比如过滤出年龄大于10的人。personList.stream().filter(person -> person.age>10).forEach(person -> System.out.println(person.getName()));//map操作----对整体流中数据的计算或者转换。比如给所有作家+10岁//常用的操作是取某一些值personList.stream().map(person -> person.getName()).forEach(name -> System.out.println(name));// 计算的话,一般用不到personList.stream().map(person -> person.age = person.age+10).forEach(person -> System.out.println(person));// distinct操作----去重。重点是重写equals方法。personList.stream().distinct().forEach(person -> System.out.println(person.getName()));// sorted操作----排序。personList.stream().sorted().forEach(person -> System.out.println(person.getAge()));// limit操作----截取。例如截取前两个。可以结合排序使用,比如排序后,截取元素personList.stream().limit(2).forEach(person -> System.out.println(person.getAge()));// skip操作----跳过。跳过前n个元素,返回剩下的。可以结合排序使用,比如排序后,跳过某些元素,返回剩下的personList.stream().skip(2).forEach(person -> System.out.println(person.getAge()));// flatMap操作----扁平化处理。扁平化对象中的List,并且把她们作为流返回Friend friend1 = new Friend("张三");Friend friend2 = new Friend("李四");Friend friend3 = new Friend("王五");List<Friend> friends = new ArrayList<>();friends.add(friend1);friends.add(friend2);friends.add(friend3);List<Person> personList2 = new ArrayList<>();personList2.add(new Person(10,"flx",friends));personList2.add(new Person(11,"cxy",friends));personList2.stream().flatMap(person -> person.getFriendList().stream()).forEach(friend -> System.out.println(friend.getName()));}/** 终结操作* */@Testvoid testStreamFinish() {Friend friend1 = new Friend("张三");Friend friend2 = new Friend("李四");Friend friend3 = new Friend("王五");List<Friend> friends = new ArrayList<>();friends.add(friend1);friends.add(friend2);friends.add(friend3);List<Person> personList = new ArrayList<>();personList.add(new Person(10,"flx",friends));personList.add(new Person(11,"cxy",friends));// forEachpersonList.stream().map(person -> person.getName()).forEach(name -> System.out.println(name));// count操作----统计数量。例如统计personList中,所有朋友的数量long count = personList.stream().flatMap(person -> person.getFriendList().stream()).count();System.out.println(count);// max和min操作----取最大值与最小值。例如取personList中年龄的最大值与最小值Optional<Integer> max = personList.stream().map(person -> person.getAge()).max((o1,o2) -> o1-o2);System.out.println(max.get());// collect操作----转换成集合。// anyMatch 、allMatch 、findAny、findFirst操作----见名知意,就是匹配操作与查找操作// anyMatch 只要有一个匹配,就返回true// allMatch 所有都匹配,才返回true// findAny 查找任意一个满足条件的元素// findFirst 查找满足条件元素的第一个Boolean b = personList.stream().anyMatch(person -> person.getAge()>10);System.out.println(b);// 查找年龄大于10的第一个元素Optional<Person> first = personList.stream().filter(person -> person.getAge() > 10).findFirst();first.ifPresent(person -> System.out.println(person.getName()));//reduce操作----归并。一般会先map一下,再执行reduce ( 我们熟悉的mapReduce()操作 )// reduce(params1,params2)// params1:初始化的第一个值// params2: 要执行的操作。// 里面有两个参数  result、element// result 每一步返回的结果// element 当前的元素// 例如,计算所有的年龄的和Integer reduce = personList.stream().map(person -> person.getAge()).reduce(0, (result, element) -> result = result + element);System.out.println(reduce);}}class Person implements Comparable<Person>{public int age;public String name;List<Friend> friendList;public List<Friend> getFriendList() {return friendList;}public void setFriendList(List<Friend> friendList) {this.friendList = friendList;}public Person(int age, String name, List<Friend> friendList) {this.age = age;this.name = name;this.friendList = friendList;}@Overridepublic boolean equals(Object o) {if (this == o) return true;if (o == null || getClass() != o.getClass()) return false;Person person = (Person) o;if (age != person.age) return false;return name != null ? name.equals(person.name) : person.name == null;}@Overridepublic int hashCode() {int result = age;result = 31 * result + (name != null ? name.hashCode() : 0);return result;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public String getName() {return name;}public void setName(String name) {this.name = name;}public Person(int age, String name) {this.age = age;this.name = name;}@Overridepublic int compareTo(Person person) {return this.getAge() - person.getAge();}
}class Friend{public String getName() {return name;}public void setName(String name) {this.name = name;}public Friend(String name) {this.name = name;}String name;}

好文推荐----接口优化思想

https://mp.weixin.qq.com/s/oeHLLvmKuq3zOQcRhSs8gw

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

相关文章:

Java8之Stream操作

Java8之Stream操作 stream干啥用的&#xff1f;创建流中间操作终结操作好文推荐----接口优化思想 stream干啥用的&#xff1f; Stream 就是操作数据用的。使用起来很方便 创建流 → 中间操作 → 终结操作 Stream的操作可以分为两大类&#xff1a;中间操作、终结操作 中间操作可…...

二分查找基础篇-JAVA

文章目录 前言 大家好,我是最爱吃兽奶,这篇博客给大家介绍一下二分查找,我们先从最基本的开始讲解,再慢慢深入,把优化和变形也和大家说一下,那么,跟着我的步伐,我们一起去看看吧! 一、什么是二分查找? 二分查找(Binary Search)也称作折半查找 二分查找的效率很高,每查找一次…...

shell脚本5数组

文章目录 数组1 数组定义方法2 获取数组长度2.1 读取数组值2.2 数组切片2.3 数组替换2.4 数组删除2.5 追加数组元素 3 实验3.1 冒泡法3.2 直接选择法3.3 反排序法 数组 1 数组定义方法 数组名(value0 valuel value2 …) 数组名( [0]value [1]value [2]value …) 列表名“val…...

Kubernetes二进制部署 单节点

目录 1.环境准备 1.关闭防火墙和selinux 2.关闭swap 3.设置主机名 4.在master添加hosts 5.桥接的IPv4流量传递到iptables的链 6.时间同步 2.部署etcd集群 1.master节点部署 2.在node1与node2节点修改 3.在master1节点上进行启动 4.部署docker引擎 3.部署 Master 组…...

基于VC + MSSQL实现的县级医院医学影像PACS

一、概述&#xff1a; 基于VC MSSQL实现的一套三甲医院医学影像PACS源码&#xff0c;集成3D后处理功能&#xff0c;包括三维多平面重建、三维容积重建、三维表面重建、三维虚拟内窥镜、最大/小密度投影、心脏动脉钙化分析等功能。 二、医学影像PACS实现功能&#xff1a; 1、…...

Jmeter 压测 QPS

文章目录 1、准备工作1.1 Jmeter的基本概念1.2 Jmeter的作用1.3.Windows下Jmeter下载安装1.4 Jmeter的目录结构1.5 启动1.6 设置中文1.6.1 设置调整1.6.2 配置文件调整&#xff08;一劳永逸&#xff09; 2、Jmeter线程组基本操作2.1 线程组是什么2.2 线程组2.2.1 创建线程组2.2…...

如何在云上部署java项目

最近博主接了一波私活&#xff0c;由于上云的概念已经深入人心&#xff0c;客户要求博主也上云&#xff0c;本文将介绍上云的教程。 1.如何选择服务器 这里博主推荐阿里云服务器&#xff0c;阿里云云服务器ECS是一种安全可靠、弹性可伸缩的云计算服务&#xff0c;助您降低 IT…...

IT行业项目管理软件,你知道多少?

IT行业项目管理软件&#xff0c;主要得看用来管理的是软件研发还是做IT运维。如果是做软件研发&#xff0c;那还得看项目经理是用什么思路&#xff0c;是传统的瀑布式方法还是敏捷的方法或者是混合的方法。 如果用来管理的是IT运维工作&#xff0c;那么很多通用型的项目管理软件…...

小爱同学接入chatGPT

大致流程 最近入手了一款小爱音响&#xff0c;想着把小爱音响接入 chatGPT, 在 github 上找了一个非常优秀的开源项目&#xff0c;整个过程还是比较简单的&#xff0c;一次就完成了。 其中最难的技术点是 如何获取与小爱的对话记录&#xff1f;如何让小爱播放文本&#xff1f…...

java运算符

1.运算符和表达式 运算符&#xff1a; ​ 就是对常量或者变量进行操作的符号。 ​ 比如&#xff1a; - * / 表达式&#xff1a; ​ 用运算符把常量或者变量连接起来的&#xff0c;符合Java语法的式子就是表达式。 ​ 比如&#xff1a;a b 这个整体就是表达式。 ​ 而其…...

StrongSORT_文献翻译

StrongSORT 【摘要】 现有的MOT方法可以被分为tracking-by-detection和joint-detection-association。后者引起了更多的关注&#xff0c;但对于跟踪精度而言&#xff0c;前者仍是最优的解决方案。StrongSORT在DeepSORT的基础之上&#xff0c;更新了它的检测、嵌入和关联等多个…...

Python每日一练(20230512) 跳跃游戏 V\VI\VII

目录 1. 跳跃游戏 V 2. 跳跃游戏 VI 3. 跳跃游戏 VII &#x1f31f; 每日一练刷题专栏 &#x1f31f; Golang每日一练 专栏 Python每日一练 专栏 C/C每日一练 专栏 Java每日一练 专栏 1. 跳跃游戏 V 给你一个整数数组 arr 和一个整数 d 。每一步你可以从下标 i 跳到&a…...

k8s部署mysql并使用nfs持久化数据

k8s部署mysql并使用nfs持久化数据 一、配置nfs服务器1.1 修改配置文件1.2. 载入配置1.3. 检查服务配置 二、创建K8S资源文件2.1 mysql-deployment.yml2.2 mysql-svc.yml 一、配置nfs服务器 参考文章: pod使用示例https://cloud.tencent.com/developer/article/1914388nfs配置…...

AI时代的赚钱思路:23岁女网红如何利用AI技术年入4亿?

一、AI技术为网红赚钱创造新途径 23岁美国网红Caryn Marjorie&#xff08;卡琳玛乔丽&#xff09;正同时交往1000多个男朋友。 作为一个在Snapchat上坐拥180万粉丝的美女&#xff0c;她利用人工智能&#xff08;AI&#xff09;技术&#xff0c;打造了一个AI版本的自己&#x…...

如何修复d3dcompiler_47.dll缺失?多种解决方法分享

在使用Windows操作系统的过程中&#xff0c;有时候会遇到d3dcompiler_47.dll缺失的情况。这个问题可能会导致某些应用程序无法正常运行&#xff0c;因此需要及时解决。本文将介绍如何修复d3dcompiler_47.dll缺失的问题。 一.什么是d3dcompiler_47.dll D3dcompiler_47.dll是Di…...

【项目实训】ATM自助取款系统

文章目录 1. 课程设计目的2. 课程设计任务与要求3. 课程设计说明书3.1 需求分析3.1.1 功能分析3.1.2 性能要求分析 3.2 概要设计3.2.1 功能模块图 3.3 详细设计3.3.1 实体类的设计3.3.2 实现数据库处理 3.4 主要程序功能流程图 4. 课程设计成果4.1 完整代码4.2 运行结果4.2.1 精…...

并查集算法

文章目录 1. 原理介绍2. 并查集的应用3. find()函数的定义与实现4. 并查集的join函数5. 路径压缩优化算法-优化find6. 路径压缩优化算法按秩合并算法 1. 原理介绍 并查集是一种用于维护集合关系的数据结构&#xff0c;它支持合并集合和查询元素所在的集合。它的基本思想是将元…...

十分钟在 macOS 快速搭建 Linux C/C++ 开发环境

有一个使用了 Epoll 的 C 项目&#xff0c;笔者平时用的 Linux 主力开发机不在身边&#xff0c;想在 macOS 上开发调试&#xff0c;但是没有 Linux 虚拟机。恰好&#xff0c;JetBrains CLion 的 Toolchains 配置除了使用本地环境&#xff0c;还支持 SSH、Docker。 笔者使用 CL…...

银河麒麟系统Arm64编译opencv指南

进入opencv官网下载版本&#xff1b;我这边下载的是2.4.13.6 &#xff1b;根据需要下载最新的 Releases - OpenCV 拷贝进麒麟系统我这边是麒麟V10 sp1 2204&#xff1b;并解 cmake 在麒麟应用商城中安装&#xff1b; 打开cmake 设置opencv路径&#xff1b;builder文件夹可以自…...

蒙层禁止下方页面滚动防抖动完美方案

学习链接 js如何禁止滚动条滚动&#xff0c;但不消失&#xff01; - 这个是完美解决方案&#xff08;在线demo示例&#xff09; 解决窗口滚动条消失而导致的页面内容抖动的问题 完美解决js 禁止滚动条滚动&#xff0c;并且滚动条不消失&#xff0c;页面大小不闪动 蒙层禁止…...

【JavaEE】-- HTTP

1. HTTP是什么&#xff1f; HTTP&#xff08;全称为"超文本传输协议"&#xff09;是一种应用非常广泛的应用层协议&#xff0c;HTTP是基于TCP协议的一种应用层协议。 应用层协议&#xff1a;是计算机网络协议栈中最高层的协议&#xff0c;它定义了运行在不同主机上…...

在 Nginx Stream 层“改写”MQTT ngx_stream_mqtt_filter_module

1、为什么要修改 CONNECT 报文&#xff1f; 多租户隔离&#xff1a;自动为接入设备追加租户前缀&#xff0c;后端按 ClientID 拆分队列。零代码鉴权&#xff1a;将入站用户名替换为 OAuth Access-Token&#xff0c;后端 Broker 统一校验。灰度发布&#xff1a;根据 IP/地理位写…...

今日科技热点速览

&#x1f525; 今日科技热点速览 &#x1f3ae; 任天堂Switch 2 正式发售 任天堂新一代游戏主机 Switch 2 今日正式上线发售&#xff0c;主打更强图形性能与沉浸式体验&#xff0c;支持多模态交互&#xff0c;受到全球玩家热捧 。 &#x1f916; 人工智能持续突破 DeepSeek-R1&…...

Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决

Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决 问题背景 在一个基于 Spring Cloud Gateway WebFlux 构建的微服务项目中&#xff0c;新增了一个本地验证码接口 /code&#xff0c;使用函数式路由&#xff08;RouterFunction&#xff09;和 Hutool 的 Circle…...

基于Java+MySQL实现(GUI)客户管理系统

客户资料管理系统的设计与实现 第一章 需求分析 1.1 需求总体介绍 本项目为了方便维护客户信息为了方便维护客户信息&#xff0c;对客户进行统一管理&#xff0c;可以把所有客户信息录入系统&#xff0c;进行维护和统计功能。可通过文件的方式保存相关录入数据&#xff0c;对…...

比较数据迁移后MySQL数据库和OceanBase数据仓库中的表

设计一个MySQL数据库和OceanBase数据仓库的表数据比较的详细程序流程,两张表是相同的结构,都有整型主键id字段,需要每次从数据库分批取得2000条数据,用于比较,比较操作的同时可以再取2000条数据,等上一次比较完成之后,开始比较,直到比较完所有的数据。比较操作需要比较…...

【LeetCode】3309. 连接二进制表示可形成的最大数值(递归|回溯|位运算)

LeetCode 3309. 连接二进制表示可形成的最大数值&#xff08;中等&#xff09; 题目描述解题思路Java代码 题目描述 题目链接&#xff1a;LeetCode 3309. 连接二进制表示可形成的最大数值&#xff08;中等&#xff09; 给你一个长度为 3 的整数数组 nums。 现以某种顺序 连接…...

CVPR2025重磅突破:AnomalyAny框架实现单样本生成逼真异常数据,破解视觉检测瓶颈!

本文介绍了一种名为AnomalyAny的创新框架&#xff0c;该方法利用Stable Diffusion的强大生成能力&#xff0c;仅需单个正常样本和文本描述&#xff0c;即可生成逼真且多样化的异常样本&#xff0c;有效解决了视觉异常检测中异常样本稀缺的难题&#xff0c;为工业质检、医疗影像…...

算法—栈系列

一&#xff1a;删除字符串中的所有相邻重复项 class Solution { public:string removeDuplicates(string s) {stack<char> st;for(int i 0; i < s.size(); i){char target s[i];if(!st.empty() && target st.top())st.pop();elsest.push(s[i]);}string ret…...

【笔记】AI Agent 项目 SUNA 部署 之 Docker 构建记录

#工作记录 构建过程记录 Microsoft Windows [Version 10.0.27871.1000] (c) Microsoft Corporation. All rights reserved.(suna-py3.12) F:\PythonProjects\suna>python setup.py --admin███████╗██╗ ██╗███╗ ██╗ █████╗ ██╔════╝…...