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

函数式编程-Stream流学习第二节-中间操作

1 Stream流概述

java8使用的是函数式编程模式,如同它的名字一样,它可以用来对集合或者数组进行链状流式操作,让我们更方便的对集合或者数组进行操作。

2 案例准备工作

我们首先创建2个类一个作家类,一个图书类

package com.stream.model;import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;import java.util.List;/*** @author xiDi* @data 2023/8/22*/
@Data
@NoArgsConstructor
@AllArgsConstructor
@EqualsAndHashCode//后期去重
public class Author implements Comparable<Author>{/*** id*/private Long id;/*** 姓名*/private String name;/*** 年龄*/private Integer age;/*** 简介*/private String intro;/*** 图书作品*/private List<Book> bookList;@Overridepublic int compareTo(Author o) {return o.getAge()-this.getAge();}
}
package com.stream.model;import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;/*** @author xiDi* @data 2023/8/22*/
@Data
@NoArgsConstructor
@AllArgsConstructor
@EqualsAndHashCode//后期去重
public class Book {/*** id*/private Long id;/*** 书名*/private String bookName;/*** 分类*/private String category;/*** 评分*/private Integer score;/*** 图书简介*/private String bookIntro;
}

然后我们进行数据初始化

  public static List<Author> getAuthor() {//数据初始化Author author = new Author(1L, "蒙多", 33, "想去那里就去那里", null);Author author2 = new Author(2L, "亚索", 15, "唯有过往,伤人最深", null);Author author3 = new Author(3L, "易", 14, "高原血统", null);Author author4 = new Author(3L, "易", 14, "高原血统", null);List<Book> bookList = new ArrayList<>();List<Book> bookList2 = new ArrayList<>();List<Book> bookList3 = new ArrayList<>();bookList.add(new Book(1L, "英雄联盟", "爱情,游戏", 80, "双手成就梦想"));bookList.add(new Book(2L, "CF", "金钱,游戏", 60, "无兄弟,无CF"));bookList2.add(new Book(3L, "CSGO", "哲学", 85, "内格夫"));bookList2.add(new Book(3L, "CSGO", "哲学,神仙", 85, "内格夫"));bookList2.add(new Book(4L, "王者荣耀", "农药", 60, "有钱就是D"));bookList3.add(new Book(5L, "钢铁雄心4", "战争,历史", 90, "人均甲级战犯"));bookList3.add(new Book(6L, "PUBG", "开挂,神仙", 59, "会玩就是挂?"));bookList3.add(new Book(6L, "PUBG", "开挂,神仙", 59, "会玩就是挂?"));author.setBookList(bookList);author2.setBookList(bookList2);author3.setBookList(bookList3);author4.setBookList(bookList3);return Arrays.asList(author, author2, author3, author4);}

3 具体方法

3.1 中间操作filter

我们要求打印姓名大于1的作家姓名,可以用到filter关键字,它的作用是过滤

我们第一步呢,就是要创建流,List创建流就是在集合后面.stream就创建了。数组创建流,使用

Arrays.stream()方法来创建

在根据我们前面学到的lambda表达式,代码就可以简写这样

 //打印作家姓名大于1的作家姓名private static void test02() {List<Author> author = getAuthor();author.stream().filter(item -> item.getName().length() > 1).forEach(item -> System.out.println(item.getName()));}

输出结果:

 3.2 中间操作 map、distinct

map的作用是流中元素进行计算或者转换,distinctd的作用是去重

 //打印所有作家姓名,去重private static void test03() {List<Author> author = getAuthor();List<String> collect = author.stream().map(Author::getName).distinct().collect(Collectors.toList());System.out.println(collect);}

输出结果

 除了可以用map拿到我们想要的数据,我们还可以用它来对数据进行处理

 //所有作家的年龄加10,并全部打印private static void test04() {List<Author> author = getAuthor();List<Integer> collect = author.stream().map(Author::getAge).map(age -> age + 10).collect(Collectors.toList());System.out.println(collect);}

输出结果

 3.3 中间操作 sorted

注意:调用空参的sorted方法需要流中的元素实现compareTo方法,才能实现排序,否则会报错
//按照年龄升序并输出姓名  --调用空参的sorted方法需要流中的元素实现compareTo方法,才能实现排序,否则会报错private static void test05() {List<Author> author = getAuthor();List<String> collect = author.stream().sorted().map(Author::getName).collect(Collectors.toList());for (String item : collect) {System.out.println(item);}}

我们调用空参的sorted方法的话需要我们流中的元素实现Comparable,并且重写compareTo方法,重写的逻辑就是看你想要实现什么排序,比我这里实现的是根据年龄去排序

 输出结果

3.4 中间操作 limit、skip

limit的作用是限制,skip的作用是跳过

  //输出年龄最大的2位作家名称,并去重  --limit 限制private static void test06() {List<Author> author = getAuthor();List<String> collect = author.stream().sorted().map(Author::getName).distinct().limit(2).collect(Collectors.toList());for (String item : collect) {System.out.println(item);}}

这里我们用来limit来实现只要年龄前2位的作家名称

//输出年龄最大作家外的其他作家名称,并去重   --skip跳过流中前n个元素private static void test07() {List<Author> author = getAuthor();List<String> collect = author.stream().sorted().map(Author::getName).distinct().skip(1).collect(Collectors.toList());for (String item : collect) {System.out.println(item);}}

我们想要输出除年龄最大外的作家名称,那么我们需要排序后,在跳过第一个即可

3.5 中间操作 faltMap

faltMap可以把一个对象转换为多个对象作为流中的元素

//输出所有图书名,并去重private static void test08() {List<Author> author = getAuthor();List<String> collect = author.stream().flatMap(item->item.getBookList().stream()).map(Book::getBookName).distinct().collect(Collectors.toList());for (String item : collect) {System.out.println(item);}}

输出结果

 4 总结

Stream还是很简单和方便的,因为我也是刚学,使用比较少,所以介绍比较笼统和简单,但是只要实操一下,就能很快记住

相关文章:

函数式编程-Stream流学习第二节-中间操作

1 Stream流概述 java8使用的是函数式编程模式,如同它的名字一样&#xff0c;它可以用来对集合或者数组进行链状流式操作&#xff0c;让我们更方便的对集合或者数组进行操作。 2 案例准备工作 我们首先创建2个类一个作家类&#xff0c;一个图书类 package com.stream.model;…...

SpringCloud 教程 | 第一篇: 服务的注册与发现(Eureka)

一、spring cloud简介 spring cloud 为开发人员提供了快速构建分布式系统的一些工具&#xff0c;包括配置管理、服务发现、断路器、路由、微代理、事件总线、全局锁、决策竞选、分布式会话等等。它运行环境简单&#xff0c;可以在开发人员的电脑上跑。另外说明spring cloud是基…...

无涯教程-进程 - 组会话控制

在本章中&#xff0c;我们将熟悉进程组&#xff0c;会话和作业控制。 进程组(Process Groups ) - 进程组是一个或多个进程的集合&#xff0c;一个进程组由一个或多个共享相同进程组标识符(PGID)的进程组成。 会话(Sessions) - 它是各种进程组的集合。…...

tomcat高可用和nginx高可用

tomcat高可用和nginx高可用 小白教程&#xff0c;一看就会&#xff0c;一做就成。 1.什么是高可用&#xff1f; 高可用HA&#xff08;High Availability&#xff09;是分布式系统架构设计中必须考虑的因素之一&#xff0c;它通常是指&#xff0c;通过设计减少系统不能提供服务…...

关于ios Universal Links apple-app-site-association文件 Not Found的问题

1. 背景说明 1.1 Universal Links 是什么 Support Universal Links 里面有说到 Universal Links 是什么、注意点、以及如何配置的。简单来说就是 当您支持通用链接时&#xff0c;iOS 用户可以点击指向您网站的链接&#xff0c;并无缝重定向到您安装的应用程序 大白话就是说&am…...

Objectarx MFC 添加ListControl并控制显隐

最主要的是实现一个Button点击将下方的List显示出来&#xff0c;制作成抽屉式菜单工具。 这篇文章是想实现点击工具栏并控制List的显隐。 参照&#xff1a; MFC中实现一个控件的隐藏和显示 【MFC】判断控件是否为隐藏状态 MFC中查找构件使用ID进行控制&#xff0c;这个和WPF&a…...

2023年高教社杯数学建模思路 - 复盘:人力资源安排的最优化模型

文章目录 0 赛题思路1 描述2 问题概括3 建模过程3.1 边界说明3.2 符号约定3.3 分析3.4 模型建立3.5 模型求解 4 模型评价与推广5 实现代码 建模资料 0 赛题思路 &#xff08;赛题出来以后第一时间在CSDN分享&#xff09; https://blog.csdn.net/dc_sinor?typeblog 1 描述 …...

SpringMVC 第二天

第 1 章 ModelAttribute 和 SessionAttribute[ 应 用 ] 1.1ModelAttribute 1.1.1 使用说明 作用&#xff1a; 该注解是 SpringMVC4.3 版本以后新加入的。它可以用于修饰方法和参数。 出现在方法上&#xff0c;表示当前方法会在控制器的方法执行之前&#xff0c;先执行…...

抖音seo短视频矩阵系统源码开发源代码分享--开源-可二开

适用于抖音短视频seo矩阵系统&#xff0c;抖音矩阵系统源码&#xff0c;短视频seo矩阵系统源码&#xff0c;短视频矩阵源码开发&#xff0c;支持二次开发&#xff0c;开源定制&#xff0c;招商加盟SaaS研发等。 功能开发设计 1. AI视频批量剪辑&#xff08;文字转语音&#x…...

No message found under code ‘-1‘ for locale ‘zh_CN‘.

导出中的报错&#xff1a;No message found under code -1 for locale zh_CN. 报错原因&#xff1a;页面中展示的数据和后端excel中的数据不一致导致 具体原因&#xff1a;...

QtWidgets和QtQuick融合(QML与C++融合)

先放一个界面效果吧&#xff01; 说明&#xff1a;该演示程序为一个App管理程序&#xff0c;可以将多个App进行吸入管理。 &#xff08;动画中的RedRect为一个带有QSplashScreen的独立应用程序&#xff09; 左侧边栏用的是QQuickView进行.qml文件的加载&#xff08;即QtQuick…...

基于Vue的3D饼图

先看效果&#xff1a; 再看代码&#xff1a; <template><div class"container"><div style"height: 100%;width: 100%;" id"bingtu3D"></div></div></template> <script> import "echarts-liqu…...

Gateway简述

前言 ​ 在微服务架构中&#xff0c;一个系统会被拆分为很多个微服务。那么作为客户端调用多个微服务接口的地址。另外微服务架构的请求中&#xff0c;90%的都携带认证信息/用户登录信息&#xff0c;都需要做相关的限制管理&#xff0c;API网关由此应允而生。 这样的架构会存…...

Midjourney API 的对接和使用

“ 阅读本文大概需要 4 分钟。 ” 在人工智能绘图领域&#xff0c;想必大家听说过 Midjourney 的大名吧。 Midjourney 以其出色的绘图能力在业界独树一帜。无需过多复杂的操作&#xff0c;只要简单输入绘图指令&#xff0c;这个神奇的工具就能在瞬间为我们呈现出对应的图像。无…...

01 消息引擎系统

本文是Kafka 核心技术与实战学习笔记 kafka的作用 kafka最经常被提到的作用是是削峰填谷&#xff0c;即解决上下游TPS的错配以及瞬时峰值流量&#xff0c;如果没有消息引擎系统的保护&#xff0c;下游系统的崩溃可能会导致全链路的崩溃。还有一个好处是发送方和接收方的松耦合…...

npm 卸载 vuecli后还是存在

运行了npm uninstall vue-cli -g&#xff0c;之后是up to date in&#xff0c;然后vue -V&#xff0c;版本号一直都在&#xff0c;说明没有卸载掉 1、执行全局卸载命令 npm uninstall vue-cli -g 2、删除vue原始文件 查看文件位置&#xff0c;找到文件删掉 where vue 3、再…...

Unity 之利用 localEulerAngle与EulerAngle 控制物体旋转

文章目录 概念讲解localEulerAngle与EulerAngle的区别 概念讲解 欧拉角&#xff08;Euler Angles&#xff09;是一种常用于描述物体在三维空间中旋转的方法。它使用三个角度来表示旋转&#xff0c;分别绕物体的三个坐标轴&#xff08;通常是X、Y和Z轴&#xff09;进行旋转。这…...

从零学算法 (剑指 Offer 13)

地上有一个m行n列的方格&#xff0c;从坐标 [0,0] 到坐标 [m-1,n-1] 。一个机器人从坐标 [0, 0] 的格子开始移动&#xff0c;它每次可以向左、右、上、下移动一格&#xff08;不能移动到方格外&#xff09;&#xff0c;也不能进入行坐标和列坐标的数位之和大于k的格子。例如&am…...

854之数据结构

一.线性表 1.顺序表 #include <iostream> #include<stdlib.h> using namespace std; #define max 100 typedef struct {int element[max];int last; } List; typedef int position ; void Insert(int x, position p, List &L) {position q;if (L.last > ma…...

Redis从基础到进阶篇(二)----内存模型与内存优化

目录 一、缓存通识 1.1 ⽆处不在的缓存 1.2 多级缓存 &#xff08;重点&#xff09; 二、Redis简介 2.1 什么是Redis 2.2 Redis的应用场景 三、Redis数据存储的细节 3.1 Redis数据类型 3.2 内存结构 3.3 内存分配器 3.4 redisObject 3.4.1 type 3.4.2 encoding 3…...

使用VSCode开发Django指南

使用VSCode开发Django指南 一、概述 Django 是一个高级 Python 框架&#xff0c;专为快速、安全和可扩展的 Web 开发而设计。Django 包含对 URL 路由、页面模板和数据处理的丰富支持。 本文将创建一个简单的 Django 应用&#xff0c;其中包含三个使用通用基本模板的页面。在此…...

django filter 统计数量 按属性去重

在Django中&#xff0c;如果你想要根据某个属性对查询集进行去重并统计数量&#xff0c;你可以使用values()方法配合annotate()方法来实现。这里有两种常见的方法来完成这个需求&#xff1a; 方法1&#xff1a;使用annotate()和Count 假设你有一个模型Item&#xff0c;并且你想…...

Vue2 第一节_Vue2上手_插值表达式{{}}_访问数据和修改数据_Vue开发者工具

文章目录 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染2. 插值表达式{{}}3. 访问数据和修改数据4. vue响应式5. Vue开发者工具--方便调试 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染 准备容器引包创建Vue实例 new Vue()指定配置项 ->渲染数据 准备一个容器,例如: …...

HarmonyOS运动开发:如何用mpchart绘制运动配速图表

##鸿蒙核心技术##运动开发##Sensor Service Kit&#xff08;传感器服务&#xff09;# 前言 在运动类应用中&#xff0c;运动数据的可视化是提升用户体验的重要环节。通过直观的图表展示运动过程中的关键数据&#xff0c;如配速、距离、卡路里消耗等&#xff0c;用户可以更清晰…...

《C++ 模板》

目录 函数模板 类模板 非类型模板参数 模板特化 函数模板特化 类模板的特化 模板&#xff0c;就像一个模具&#xff0c;里面可以将不同类型的材料做成一个形状&#xff0c;其分为函数模板和类模板。 函数模板 函数模板可以简化函数重载的代码。格式&#xff1a;templa…...

安宝特案例丨Vuzix AR智能眼镜集成专业软件,助力卢森堡医院药房转型,赢得辉瑞创新奖

在Vuzix M400 AR智能眼镜的助力下&#xff0c;卢森堡罗伯特舒曼医院&#xff08;the Robert Schuman Hospitals, HRS&#xff09;凭借在无菌制剂生产流程中引入增强现实技术&#xff08;AR&#xff09;创新项目&#xff0c;荣获了2024年6月7日由卢森堡医院药剂师协会&#xff0…...

springboot 日志类切面,接口成功记录日志,失败不记录

springboot 日志类切面&#xff0c;接口成功记录日志&#xff0c;失败不记录 自定义一个注解方法 import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target;/***…...

SpringAI实战:ChatModel智能对话全解

一、引言&#xff1a;Spring AI 与 Chat Model 的核心价值 &#x1f680; 在 Java 生态中集成大模型能力&#xff0c;Spring AI 提供了高效的解决方案 &#x1f916;。其中 Chat Model 作为核心交互组件&#xff0c;通过标准化接口简化了与大语言模型&#xff08;LLM&#xff0…...

【堆垛策略】设计方法

堆垛策略的设计是积木堆叠系统的核心&#xff0c;直接影响堆叠的稳定性、效率和容错能力。以下是分层次的堆垛策略设计方法&#xff0c;涵盖基础规则、优化算法和容错机制&#xff1a; 1. 基础堆垛规则 (1) 物理稳定性优先 重心原则&#xff1a; 大尺寸/重量积木在下&#xf…...

聚六亚甲基单胍盐酸盐市场深度解析:现状、挑战与机遇

根据 QYResearch 发布的市场报告显示&#xff0c;全球市场规模预计在 2031 年达到 9848 万美元&#xff0c;2025 - 2031 年期间年复合增长率&#xff08;CAGR&#xff09;为 3.7%。在竞争格局上&#xff0c;市场集中度较高&#xff0c;2024 年全球前十强厂商占据约 74.0% 的市场…...