Java 8 Stream API

Stream API是一个强大的工具,用于处理数据集合。它提供了一种声明式的方式来处理数据,支持并行处理,使代码更加简洁和高效。

1. 基本概念

Stream API提供了一种高效且易于使用的处理数据的方式。它不是数据结构,而是对集合对象功能的增强,专注于对集合对象进行各种非常便利、高效的聚合操作或大批量数据操作。

2. 创建Stream的方式

  • 从集合创建:list.stream()
  • 从数组创建:Arrays.stream(array)
  • 从静态方法创建:Stream.of(), Stream.iterate(), Stream.generate()

3. Stream操作类型

Stream操作分为中间操作和终端操作:

中间操作:返回Stream本身,可以链式调用(如filter、map、sorted等)

终端操作:返回特定类型的结果(如collect、forEach、count、reduce等)

4.操作

fiter

用于过滤元素,接收一个Predicate函数式接口作为参数:

复制代码
List<String> filtered = list.stream()
                            .filter(s -> s.startsWith("a"))
                            .collect(Collectors.toList());

map

用于转换元素,接收一个Function函数式接口作为参数:

复制代码
List<Integer> lengths = list.stream()
                            .map(String::length)
                            .collect(Collectors.toList());

collect

终端操作,用于收集Stream中的元素到集合中:

复制代码
// 收集到List中
List<String> result = stream.collect(Collectors.toList());

// 收集到Set中
Set<String> result = stream.collect(Collectors.toSet());

// 收集到Map中
Map<String, Integer> result = stream.collect(Collectors.toMap(
    String::toUpperCase, 
    String::length
));

groupingBy

用于分组操作,常用于Collectors中:

复制代码
Map<String, List<Person>> peopleByCity = people.stream()
    .collect(Collectors.groupingBy(Person::getCity));
5. 其他重要操作
  • distinct(): 去除重复元素
  • sorted(): 排序
  • limit(): 限制元素数量
  • skip(): 跳过元素
  • forEach(): 遍历
  • reduce(): 归约操作
  • count(): 计数
6. 并行流

Stream API支持并行处理,可以大大提高大数据集的处理效率:

XML 复制代码
list.parallelStream()
    .filter(s -> s.length() > 3)
    .map(String::toUpperCase)
    .collect(Collectors.toList());
7. 函数式接口

Stream API大量使用了函数式接口:

  • Predicate<T>: 布尔值判断
  • Function<T,R>: 转换函数
  • Consumer<T>: 消费数据
  • Supplier<T>: 提供数据

8. 实际应用示例

XML 复制代码
// 提取站点名称并去重
Set<String> siteNames = codeInfoExceDTOS.stream()
    .map(PsSourceCodeInfoExceDTO::getSiteName)
    .filter(Objects::nonNull)
    .collect(Collectors.toSet());

// 按出库单号分组
Map<String, List<PsSourceCodeInfoExceDTO>> groupedByOutNum = codeInfoExceDTOS.stream()
    .collect(Collectors.groupingBy(PsSourceCodeInfoExceDTO::getOutNum));
相关推荐
Wang's Blog5 小时前
Java 项目部署之 Docker工具快速入门: Docker 是什么以及它如何解决部署环境问题
java·开发语言·docker
老木避暑研究所5 小时前
从原始数据到洞察:一次完整的避暑房环境数据采集、清洗与可视化分析
java·开发语言
程序喵大人6 小时前
【C++入门】编译链接模型 - 05 ODR 为什么会让重复定义变成工程炸点
开发语言·c++·编译链接·odr
weixin199701080166 小时前
《淘宝TOP API:落地方案、接口边界与业务踩坑 —— 聚石塔内外价差 10 倍的真相》(附 Python 源码)
开发语言·python
前端 贾公子6 小时前
LangGraph == 图的状态(State)管理 (上)
java·开发语言·数据库
huaweichenai6 小时前
spring boot 实现file文件上传
java·spring boot·后端
VX_bysjlw9856 小时前
数码设备销售网站设计与实现39138-计算机毕设原创(免费领源码+带部署教程)
java·vue.js·spring boot·mysql·tomcat·mybatis·idea
荣码7 小时前
从0到1搭一个生产级RAG系统:串联前面21篇所有知识
java·python
xuxigifxfh7 小时前
牛客:HJ170 01序列
java·开发语言·算法·华为机考
朝朝辞暮i7 小时前
C++ 第 33 课:事件循环——spin() 到底在干什么
开发语言·c++·算法