Java Stream 流的使用

ops/2024/12/19 18:55:54/

Java Stream 流的使用

在实际生产中,几乎很少使用for循环的结构进行操作,Java 8 提供的Stream可以大大提高程序员的生产力,由于自己之前对于Stream 流使用的并不是很熟练,所以在这里进行简单的总结归纳。

最后熟练的使用Stream流,不仅仅是对基础的熟悉,还是需要对于业务的一些理解需要比较深刻。

一、Stream 流的介绍

Stream流是类似于SQL语句,可以通过一种比较直观的方式对java的集合进行运算。

Stream 流,就是将要处理的元素看作是一种流,这个流在管道中运输,我们可以在管道中对管道中的节点进行处理,比如 筛选、排序、聚合 等等。

可以通过以下图,了解流的使用:

java">+--------------------+       +------+   +------+   +---+   +-------+
| stream of elements +-----> |filter+-> |sorted+-> |map+-> |collect|
+--------------------+       +------+   +------+   +---+   +-------+

Stream流有以下特点:

  • 元素是特定类型的对象,形成一个队列。Java的Stream流不会存储元素,而是按需计算。
  • Stream数据流的来源,可以是集合、数组,I/O,产生器等等。
  • 聚合操作包括filter, map, reduce, find, match, sorted等等。

生成流

  • stream() 为集合创建串行流;目前基本都是串行流
  • parallelStream() 为集合创建并行流

二、使用方式介绍

forEach

forEach可以迭代流中的每个元素。

java">Random random = new Random();
random.ints().limit(10).forEach(System.out::println);

map

map用于映射每个元素对应的结果。

java">List<Integer> numbers = Arrays.asList(3, 2, 2, 3, 7, 3, 5);
// 获取对应的平方数
List<Integer> squaresList = numbers.stream().map( i -> i*i).distinct().collect(Collectors.toList());

filter

filter可以设置过滤条件。

java">List<String>strings = Arrays.asList("abc", "", "bc", "efg", "abcd","", "jkl");
// 获取空字符串的数量
long count = strings.stream().filter(string -> string.isEmpty()).count();

limit

limit可以用于获取指定数量的流。

java">Random random = new Random();
random.ints().limit(10).forEach(System.out::println);

sorted

sorted可以对流里面的对象进行排序

java">Random random = new Random();
random.ints().limit(10).sorted((x,y) -> x.getWeight() - y.getWeight()).forEach(System.out::println);

Collectors

Collectors实现了很多归约操作,可以将流对象转换成集合,hash表(Map)、set、List等等

java">List<String>strings = Arrays.asList("abc", "", "bc", "efg", "abcd","", "jkl");
List<String> filtered = strings.stream().filter(string -> !string.isEmpty()).collect(Collectors.toList());System.out.println("筛选列表: " + filtered);
String mergedString = strings.stream().filter(string -> !string.isEmpty()).collect(Collectors.joining(", "));
System.out.println("合并字符串: " + mergedString);

三、实战举例

1. 创建实体类

java">public class Organization {/*** 自增主键*/private Long id;/*** 组织id*/private Long orgId;/*** 组织名称*/private String orgName;/*** 组织简称*/private String simpleName;/*** 组织标签*/private String labels;/*** 组织行业*/private String industry;/*** 状态,1为删除,0为正常*/private Integer status;/*** 创建时间*/private Long createTime;/*** 更新时间*/private Long updateTime;
}

2. 创建流

Stream流有两种类型,串行流,大部分基本都是串行流,小部分是并行流。

java">List<Organization> organizationList = new ArrayList<>();
//1. 创建一个串行stream对象
Stream<Organization> stream = organizationList.stream();
//2. 创建一个并行stream对象
Stream<Organization> parallelStream = organizationList.parallelStream();

3. filter

filter 主要是做筛选, filter括号里面结果满足返回true 不满足返回false,返回结果为return true筛选后的结果

java">//filter 过滤
organizationList = organizationList.stream().filter(organization -> organization.getId() > 5).collect(Collectors.toList());//以下是等价的:
organizationList = organizationList.stream().filter(organization -> {if (organization.getId() > 5) {return true;} else {return false;}}).collect(Collectors.toList());

4. forEach

forEach主要用来遍历

java">//forEach 遍历
organizationList.stream().forEach(System.out::println);

5. map

map可以对里面的对象进行操作,设置元素值,也可以获取对象里面的特定属性,转换为一个集合。

(1)获取自己想要的值
java">//获取industry属性,并将其转换为list
List<String> industryList = organizationList.stream().map(organization -> organization.getIndustry()).collect(Collectors.toList());industryList.stream().forEach(System.out::println);
(2) 设置里面的元素的属性
java">// 将orgName属性设置为New Name + id
organizationList = organizationList.stream().map(organization -> {organization.setOrgName("New Name " + organization.getId());return organization;}).collect(Collectors.toList());

6.controller

特别重要的,需要掌握的一点。可以将流对象转化为各种形式,比如map, list, set等等。

java">//collect 将流转换为其他形式,如list、set、map等
Map<Long, Organization> organizationMap = organizationList.stream().collect(Collectors.toMap(Organization::getId, organization -> organization));// map中key重复用这个加(oldValue, newValue) -> oldValue 的方法,保留旧的值
organizationMap = organizationList.stream().collect(Collectors.toMap(Organization::getId, organization -> organization, (oldValue, newValue) -> oldValue));// 将流转换为list
List<Long> idList = organizationList.stream().map(Organization::getId).collect(Collectors.toList());// 将流转换为set
Set<Long> idSet = organizationList.stream().map(Organization::getId).collect(Collectors.toSet());

7.sorted

可以对流中的元素进行排序。可以正序,逆序。

java">//sorted 对流中的元素进行排序
organizationList = organizationList.stream().sorted((o1, o2) -> {if (o1.getId() > o2.getId()) {return 1;} else {return -1;}
}).collect(Collectors.toList());
//根据Id进行增序排序
organizationList.stream().sorted((o1, o2) -> (int)(o1.getId() - o2.getId())).collect(Collectors.toList());
//根据Id进行降序排序
organizationList.stream().sorted((o1, o2) -> (int)(o2.getId() - o1.getId())).collect(Collectors.toList());

8. count

count可以获取到数量,进行计数

java">//统计流中的元素数量
long count = organizationList.stream().count();

9.limit

limit可以限制在stream流中获取的个数

java">//最多获取到前五个数据
organizationList = organizationList.stream().limit(5).collect(Collectors.toList());

10.skip

skip可以跳过数据的个数

java">//跳过第1个元素
organizationList = organizationList.stream().skip(1).collect(Collectors.toList());

四、组合复杂运算

java">//1.根据orgId进行分组,分组之后,再将他所属的Id组合起来,将其转换为<Map<Long, List<Long>>形式
Map<Long, List<Long>> getUserList = organizationList.stream().collect(Collectors.groupingBy(Organization::getOrgId,Collectors.mapping(Organization::getId,Collectors.toList())));//2.

http://www.ppmy.cn/ops/143259.html

相关文章

IO的进阶

目录 1. 字符流转向字节流的桥梁1.1 OutputStreamWriter1.2 InputStreamReader1.3 编码与解码1.4 常见编码方式1.5 编码与解码的注意事项 2.Properties2.1概述2.2 Properties 的常用方法2.3 Properties 的应用场景2.4 实例 3.序列化3.1 ObjectOutputStream 4.字符编码4.1 ASCII…

《网络对抗技术》Exp9 Web安全基础

实验目标 理解常用网络攻击技术的基本原理。 实验内容 Webgoat实践下相关实验。 实验环境 macOS下Parallels Desktop虚拟机中&#xff08;网络源均设置为共享网络模式&#xff09;&#xff1a; Kali Linux - 64bit&#xff08;攻击机&#xff0c;IP为10.211.55.10&#xff09;…

C++ OCR证件照文字识别

一.引言 文字识别&#xff0c;也称为光学字符识别&#xff08;Optical Character Recognition, OCR&#xff09;&#xff0c;是一种将不同形式的文档&#xff08;如扫描的纸质文档、PDF文件或数字相机拍摄的图片&#xff09;中的文字转换成可编辑和可搜索的数据的技术。随着技…

科研绘图系列:R语言绘制韦恩图(Venn plot)

禁止商业或二改转载,仅供自学使用,侵权必究,如需截取部分内容请后台联系作者! 文章目录 介绍加载R包数据下载导入数据数据处理画图系统信息介绍 R语言绘制韦恩图(Venn plot) 加载R包 library(tidyverse) library(ggplot2) library(ggrepel) library(dplyr) library(rea…

docker安装mysql5.7

1、宿主机创建映射目录 mkdir -p /data/mysql/log mkdir -p /data/mysql/data mkdir -p /data/mysql/conf这里我放在了/data/mysql目录下 2、拉取mysql镜像 docker pull mysql:5.7注意是5.7版本&#xff0c;如果是8版本操作会略有不同&#xff0c;下篇文章介绍安装8版本的操…

HTTP 协议

文章目录 1. 预备知识1.1 域名1.2 url 2. http请求和响应的格式2.1 http request2.2 http response2.3 使用telnet看一下http response2.4 使用fiddler来进行抓包&#xff0c;看一下http request 3. 写一个简单的httpserver3.1 基础框架3.2 web根目录3.3 拿到url&#xff0c;更…

vlan和vlanif

文章目录 1、为什么会有vlan的存在2、vlan(虚拟局域网)1、vlan原理1. 为什么这样划分了2、如何实现不同交换机相同的vlan实现互访呢3、最优化的解决方法&#xff0c;vlan不同交换机4、vlan标签和vlan数据帧 5、vlan实现2、基于vlan的划分方式1、基于接口的vlan划分方式2、基于m…

spring使用rabbitmq当rabbitmq集群节点挂掉 spring rabbitmq怎么保证高可用,rabbitmq网络怎么重新连接

##spring rabbitmq代码示例 Controller代码 import com.alibaba.fastjson.JSONObject; import com.newland.mi.config.RabbitDMMQConfig; import org.springframework.amqp.core.Message; import org.springframework.amqp.core.MessageProperties; import org.springframewo…