第7章-第9节-Java中的Stream流(链式调用)
1、什么是Stream流
Lambda表达式,基于Lambda所带来的函数式编程,又引入了一个全新的Stream概念,用于解决集合类库既有的鼻端。
2、案例
假设现在有一个需求, 将list集合中姓张的元素过滤到一个新的集合中;然后将过滤出来的姓张的元素中,再过滤出来长度为3的元素,存储到一个新的集合中
// 已知的知识来解决需求
List<String> list1 = new ArrayList<>();
list1.add("张老三");
list1.add("张小三");
list1.add("李四");
list1.add("赵五");
list1.add("张六");
list1.add("王八");ArrayList<String> list2 = new ArrayList<>();
// 1.将list集合中姓张的元素过滤到一个新的集合中
for(String name : list1){if(name.startsWith("张")){list2.add(name);}
}
ArrayList list3 = new ArrayList();
for (String name : list2) {if (name.length() == 3){list3.add(name);}
}
System.out.println(list3);
很麻烦,不是吗,同样我们需要更加简洁优雅的方式实现 (链式调用)
3、 Stream流
list1.stream().filter((String name)->name.startsWith("张")).filter((String name)->name.length()==3).forEach((String name)->{System.out.println("符合条件的姓名:" + name);
});
4、获取流的方式
Stream<String> stream1 = list.stream();
Stream<String> stream2 = set.stream();//根据Map集合的键获取流
Set<Integer> map1 = map.keySet();
Stream<Integer> stream3 = map1.stream();
//根据Map集合的值获取流
Collection<String> map2 = map.values();
Stream<String> stream4 = map2.stream();
//根据Map集合的键值对对象获取瑞
Set<Map.Entry<Integer, String>> map3 = map.entrySet();
Stream<Map.Entry<Integer, String>> stream5 = map3.stream();
// 根据数组获取流
String[] arr = {"张颜宇","张三","李四","赵五","刘六","王七"};
Stream<String> stream6 = Stream.of(arr);
5、Stream流的常用方法
1)、count方法
List<String> list = new ArrayList<>();list.add("张老三");list.add("张小三");list.add("李四");list.add("赵五");list.add("张六");list.add("王八");long count = list.stream().count();System.out.println("集合中的元素个数是:" + count);//输出结果://集合中的元素个数是:6
2)、filter 方法
// 获取stream流
Stream<String> stream = Stream.of("张老三", "张小三", "李四", "赵五", "刘六", "王七");
// 需求:过去出姓张的元素
stream.filter((String name)->{return name.startsWith("张");
}).forEach((String name)->{System.out.println("流中的元素" + name);
});
3)、foreach 方法
List<String> list = new ArrayList<>();
list.add("张老三");
list.add("张小三");
list.add("李四");
list.add("赵五");
list.add("张六");
list.add("王八");// 函数模型:获取流 --> 注意消费流中的元素
list.stream().forEach((String name)->{System.out.println(name);
});
4)、limit方法
// 获取流的长度
Stream<String> stream1 = Stream.of("张老三", "张小三", "李四", "赵五", "刘六", "王七");
// 需求:保留前三个元素
stream1.limit(3).forEach((String name)->{System.out.println("流中的前三个元素是:" + name);
});
5)、map方法
//基本类型转换
// 获取Stream流
Stream<String> stream1 = Stream.of("11","22","33","44","55");
// 需求:把stream1流中的元素转换为int类型
stream1.map((String s)->{return Integer.parseInt(s); // 将String类型的s进行转换为Integer类型的元素,并返回
}).forEach((Integer i)->{System.out.println(i); // 将转换后的int类型的元素逐一输出
});
//大写转换收集
List list = new ArrayList<>();
list.add("apple");
list.add("banana");
list.add("orange");
Stream stream = list.stream().map(s -> s.toUpperCase());
stream.forEach(System.out::println);
//元素计算收集
List list = Arrays.asList(1, 2, 3, 4, 5);
List resultList = list.stream().map(x -> x * x).collect(Collectors.toList());
System.out.println(resultList);
//引用数据类型属性收集
List people = new ArrayList<>();
people.add(new Person("Tom", 18));
people.add(new Person("Jerry", 20));
List result = people.stream().map(Person::getName).collect(Collectors.toList());
System.out.println(result);
//实体类map类型收集
List people = new ArrayList<>();
people.add(new Person("Tom", 18));
people.add(new Person("Jerry", 20));
Map result = people.stream().collect(Collectors.toMap(Person::getName, Person::getAge));
System.out.println(result);
6)、skip方法
// 获取stream流
Stream<String> stream = Stream.of("张老三", "张小三", "李四", "赵五", "刘六", "王七");
stream.skip(3).forEach((String name)->{System.out.println("跳过前三个,打印剩下的" + name);
});
7)、concat方法
Stream<String> stream1 = Stream.of("11","22","33","44","55");
Stream<String> stream2 = Stream.of("张颜宇", "张三", "李四", "赵五", "刘六", "王七");
// 需求:合并两个流
Stream<String> stream = Stream.concat(stream1,stream2);
stream.forEach((String name)->{System.out.print(name);
});
8)、收集Stream流方法
List<String> list2 = new ArrayList<>();
list2.add("张老三");
list2.add("张小三");
list2.add("李四");
list2.add("赵五");
list2.add("张六");
list2.add("王八");// 需求:过滤出姓张的并且长度为3的元素
Stream<String> stream = list2.stream().filter((String name) -> {return name.startsWith("张");
}).filter((String name) -> {return name.length() == 3;
});// stream 收集到单列集合中
List<String> list = stream.collect(Collectors.toList());
System.out.println(list);// stream 收集到单列集合中
Set<String> set = stream.collect(Collectors.toSet());
System.out.println(set);
public class StreamTest {public static void main(String[] args) {List<String> names = new ArrayList<>();//Collections.addAll();Collections.addAll(names,"张三丰","张无忌","李四","王五","李娜","吴彦祖");
// System.out.println(names);// for (String s:names) {
// //打印所有姓张的
// if(s.startsWith("张")){
// System.out.println(s);
// }
// //打印出所有名字长度是3的
// if(s.length()==3){
// System.out.println(s);
// }
// }//Stream 流实现集合过滤//1. 通过集合获取流Stream<String> s1 = names.stream();//2. 过滤器 filter 遍历器 foreach//过滤出所有姓张的姓名
// s1.filter((String name) -> name.startsWith("张"))
// .forEach((String name) -> {
// System.out.println(name);
// });//limit(X) 取前X个数据Stream<String> stm2 = Stream.of("张小毛","赵本山","吴亦凡","曹孟德","刘备","李斯");
// stm2.limit(3).forEach((String s) -> System.out.println(s));//skip(X) 跳过X个数据,打印剩下的
// stm2.skip(3).forEach((String s) -> System.out.println(s));//concat(流1,流2) 合并流1和流2 (泛型最好相同)Stream<String> stream3 = Stream.of("11","22","33","44","55");//合并两个流存到stmAll中
// Stream<String>stmAll = Stream.concat(stm2,stream3);
// stmAll.forEach((String s) -> System.out.println(s));//map 映射
// stream3.map((String n) -> {
// return Integer.parseInt(n);
// }).forEach((Integer num)-> System.out.println(num));// stream3.map((String number) -> {
// number = "100";
// return number;
// }).forEach((String n) -> System.out.println(n));Stream<String> stm4 = Stream.of("张小毛","赵本山","吴亦凡","曹孟德","刘备","李斯");//挑选出3个字名字,并且存入一个List中List ss = stm4.filter((String name) ->name.length() == 3).collect(Collectors.toList()); //collect收集方法:将过滤出来的数据转为集合//Collectors.toList()转为什么集合toList List集合//关闭stm4.close();System.out.println(ss);// AtomicInteger sum = new AtomicInteger();
// AtomicInteger sum_mew = new AtomicInteger();
// stream3.map((String n) -> {
// sum.set(Integer.parseInt(n) + sum.get());
// return sum;
// }).forEach((AtomicInteger num)-> {
// sum_mew.set(num.get());
// });
// System.out.println("总和为:"+sum_mew);}
}
9)、Stream流的reduce方法
//利用reduce方法快捷运算
List numbers = Arrays.asList(1, 2, 3, 4, 5);
int sum = numbers.stream().reduce((a, b) -> a + b).get();
System.out.println(sum);
本电子书目录:《Java基础的重点知识点全集》
相关文章:

第7章-第9节-Java中的Stream流(链式调用)
1、什么是Stream流 Lambda表达式,基于Lambda所带来的函数式编程,又引入了一个全新的Stream概念,用于解决集合类库既有的鼻端。 2、案例 假设现在有一个需求, 将list集合中姓张的元素过滤到一个新的集合中;然后将过滤…...

创建一个矩形中有两个三角形
#include <glad/glad.h> #include <GLFW/glfw3.h>#include <iostream>float vertices[] {// 第一个三角形0.5f, 0.5f, 0.0f, // 右上0.5f, -0.5f, 0.0f, // 右下-0.5f, -0.5f, 0.0f, // 左下-0.5f, 0.5f, 0.0f, // 左上 };unsigned i…...
Open3D 基于kdtree树的邻近点搜索(10)
Open3D 基于kdtree树的邻近点搜索(10) 一、算法简介二、算法实现1.K邻近点搜索2.R邻域点搜索三、结果释义一、算法简介 KD 树(k-dimensional tree)是一种用于组织 k 维空间中点的数据结构,旨在提供高效的 k 最近邻搜索和范围搜索(如半径邻域搜索)。KD 树通过递归地将空间…...

c++实现支持动态扩容的栈(stack)
1.在栈容量满时自动扩容: 支持自动扩容栈实现: // // myStack.hpp // algo_demo // // Created by Hacker X on 2024/1/9. //#ifndef myStack_hpp #define myStack_hpp #include <stdio.h> #include <string.h> //栈实现 //1.入栈 //2.出栈 //3.空栈 //4.满栈 …...
举例说明计算机视觉(CV)技术的优势和挑战。
计算机视觉(Computer Vision,CV)技术是指使计算机能够理解和解释视觉数据的能力。CV技术在很多领域都有广泛的应用,包括图像处理、目标检测、人脸识别、自动驾驶等。以下是CV技术的一些优势和挑战的例子: 优势&#x…...
如何利用docker来部署war包项目
首先编写dockerfile文件: # 使用官方的Tomcat镜像作为基础镜像 FROM tomcat:9.0# 将war包复制到容器的webapps目录下 COPY xxxx.war /usr/local/tomcat/webapps/# 暴露Tomcat的默认端口 EXPOSE 8080 编写docker-compose.yml文件: version: 3 services…...

SpringBoot 如何增强PageHelper入参的健壮性
PageHelper.startPage(int pageNum, int pageSize, boolean count) 参数为外部输入,故存在异常输入场景。比如 pageNum 和 pageSize 输入的值 负数 或者 0,所以引入PageUtils来对入参进行判断矫正,从而避免引入异常。 第1步:支持…...

书生·浦语大模型全链路开源体系 学习笔记 第三课
huggingface-cli: command not found 按照该文档解决即可 https://github.com/huggingface/huggingface_hub/issues/1079 具体如下: 1、确保环境已将安装huggingface-cli 2、版本需要旧版,pip install huggingface_hub0.20.1 3、再按如下执行 # T…...

CodeGPT,你的智能编码助手—CSDN出品
CodeGPT是由CSDN打造的一款生成式AI产品,专为开发者量身定制。 无论是在学习新技术还是在实际工作中遇到的各类计算机和开发难题,CodeGPT都能提供强大的支持。其涵盖的功能包括代码优化、续写、解释、提问等,还能生成精准的注释和创作相关内…...

VMware Workstation——修改虚拟机配置和设置网络
目录 一、修改配置 1、点击需要修改配置的虚拟机,然后点击编辑虚拟机配置 2、修改内存、CPU、硬盘配置 二、设置网络 1、从虚拟机配置中进入到网络适配器设置 2、选择网络连接模式 一、修改配置 1、点击需要修改配置的虚拟机,然后点击编辑虚拟机配…...

计算机毕业设计 基于SpringBoot的项目申报系统的设计与实现 Java实战项目 附源码+文档+视频讲解
博主介绍:✌从事软件开发10年之余,专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ 🍅文末获取源码联系🍅 👇🏻 精…...
CentOS 7.8 安装 Docker
1.卸载旧版本 sudo yum remove docker \ docker-client \ docker-client-latest \ docker-common \ docker-latest \ docker-latest-logrotate \ docker-logrotate \ docker-engine2.安装依赖 sudo yum -y install gcc sudo yum -y install gcc-c3.安装软件包 sudo yum inst…...

Flask 会员列表展示
感谢编程浪子师傅的源码信息分享 web/controllers/member/Member.py # -*- coding: utf-8 -*- from flask import Blueprint,request,redirect,jsonify from common.libs.Helper import ops_render,iPagination,getCurrentDate,getDictFilterField,selectFilterObj from comm…...

光纤知识总结
1光纤概念: 光导纤维(英语:Optical fiber),简称光纤,是一种由玻璃或塑料制成的纤维,利用光在这些纤维中以全内反射原理传输的光传导工具。 微细的光纤封装在塑料护套中,使得它能够…...
LeetCode简单题记录
1、两数之和,给定数组nums,求和为target的两个数组元素的下标 我用了两个for循环,官方解为 哈希表,知识盲区 class Solution { public:vector<int> twoSum(vector<int>& nums, int target) {unordered_map<i…...

【Python学习】Python学习10-列表
目录 【Python学习】Python学习10-列表 前言创建语法访问列表中的值更新和删除列表元素操作列表列表截取Python列表函数&方法参考 文章所属专区 Python学习 前言 本章节主要说明Python的列表List。 创建语法 创建一个列表 通过方括号和逗号分割创建,列表数据…...

MySQL四大引擎,数据库管理,数据表管理,数据库账号管理
MySQL四大引擎 InnoDB InnoDB引擎是MySQL默认的存储引擎。它支持事务和行级锁定,并具有高并发性和数据完整性保护的特性。InnoDB适用于具有复杂查询和高并发读写操作的应用程序。MyISAM InnoDB引擎特点和优势 事务支持:InnoDB支持ACID(原子…...

CentOS找回root密码
很悲伤,你忘记了root密码。。。 那就来重置它吧~ 1、在启动时选择操作系统:在引导过程中,选择CentOS操作系统并按下键盘上的任意键来停止引导。 2、 进入编辑模式:在启动菜单中,找到并选择要编辑的CentOS条目&…...

react输入框检索树形(tree)结构
input搜索框搜索树形子级内容1. input框输入搜索内容2. 获取tree结构数据3. 与tree匹配输入的内容,tree是多维数组,一级一级的对比输入的内容是否匹配,用forEach循环遍历数据,匹配不到在往下找,直到找到为null &#x…...

云原生学习系列之基础环境准备(虚拟机搭建)
最近由于工作需要开始学习云原生相关内容,为方便学习操作,准备在外网搭建自己的环境,然后进行相关的练习,搭建环境的第一步便是虚拟机的安装。 基础软件 这里我用到的是CentOS-7-x86_64的操作系统。 链接:https://pa…...

19c补丁后oracle属主变化,导致不能识别磁盘组
补丁后服务器重启,数据库再次无法启动 ORA01017: invalid username/password; logon denied Oracle 19c 在打上 19.23 或以上补丁版本后,存在与用户组权限相关的问题。具体表现为,Oracle 实例的运行用户(oracle)和集…...
论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(二)
HoST框架核心实现方法详解 - 论文深度解读(第二部分) 《Learning Humanoid Standing-up Control across Diverse Postures》 系列文章: 论文深度解读 + 算法与代码分析(二) 作者机构: 上海AI Lab, 上海交通大学, 香港大学, 浙江大学, 香港中文大学 论文主题: 人形机器人…...
工程地质软件市场:发展现状、趋势与策略建议
一、引言 在工程建设领域,准确把握地质条件是确保项目顺利推进和安全运营的关键。工程地质软件作为处理、分析、模拟和展示工程地质数据的重要工具,正发挥着日益重要的作用。它凭借强大的数据处理能力、三维建模功能、空间分析工具和可视化展示手段&…...

【配置 YOLOX 用于按目录分类的图片数据集】
现在的图标点选越来越多,如何一步解决,采用 YOLOX 目标检测模式则可以轻松解决 要在 YOLOX 中使用按目录分类的图片数据集(每个目录代表一个类别,目录下是该类别的所有图片),你需要进行以下配置步骤&#x…...

(转)什么是DockerCompose?它有什么作用?
一、什么是DockerCompose? DockerCompose可以基于Compose文件帮我们快速的部署分布式应用,而无需手动一个个创建和运行容器。 Compose文件是一个文本文件,通过指令定义集群中的每个容器如何运行。 DockerCompose就是把DockerFile转换成指令去运行。 …...

Unsafe Fileupload篇补充-木马的详细教程与木马分享(中国蚁剑方式)
在之前的皮卡丘靶场第九期Unsafe Fileupload篇中我们学习了木马的原理并且学了一个简单的木马文件 本期内容是为了更好的为大家解释木马(服务器方面的)的原理,连接,以及各种木马及连接工具的分享 文件木马:https://w…...
Angular微前端架构:Module Federation + ngx-build-plus (Webpack)
以下是一个完整的 Angular 微前端示例,其中使用的是 Module Federation 和 npx-build-plus 实现了主应用(Shell)与子应用(Remote)的集成。 🛠️ 项目结构 angular-mf/ ├── shell-app/ # 主应用&…...

FFmpeg:Windows系统小白安装及其使用
一、安装 1.访问官网 Download FFmpeg 2.点击版本目录 3.选择版本点击安装 注意这里选择的是【release buids】,注意左上角标题 例如我安装在目录 F:\FFmpeg 4.解压 5.添加环境变量 把你解压后的bin目录(即exe所在文件夹)加入系统变量…...

(一)单例模式
一、前言 单例模式属于六大创建型模式,即在软件设计过程中,主要关注创建对象的结果,并不关心创建对象的过程及细节。创建型设计模式将类对象的实例化过程进行抽象化接口设计,从而隐藏了类对象的实例是如何被创建的,封装了软件系统使用的具体对象类型。 六大创建型模式包括…...
在树莓派上添加音频输入设备的几种方法
在树莓派上添加音频输入设备可以通过以下步骤完成,具体方法取决于设备类型(如USB麦克风、3.5mm接口麦克风或HDMI音频输入)。以下是详细指南: 1. 连接音频输入设备 USB麦克风/声卡:直接插入树莓派的USB接口。3.5mm麦克…...