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

Stream的常用API应用场景

速记

目标一口流利的 API
过滤.filter(Predicate)
转换.map(Function)
一对多展开.flatMap(Collection::stream)
分组Collectors.groupingBy
去重合并Collectors.toMap(key, value, mergeFn)
防空指针Optional.ofNullable(..).map(..).orElse
调试.peek(System.out::println)

详解

你看到的方法属于哪个 API背后的函数式接口
.stream()Collection 接口(1.8 默认方法)无,只是个入口
.filter(...)Stream 接口Predicate<T>
.map(...)Stream 接口Function<T,R>
.collect(Collectors.xxx)Stream 接口各种 Collector 实现
Optional.ofNullable(...)java.util.OptionalConsumerFunctionSupplier
List<String> upper =names.stream()              // 1. 入口:Collection.stream().filter(s -> s != null)     // 2. filter 属于 Stream API,参数是 Predicate 函数式接口.map(String::toUpperCase)   // 3. map 属于 Stream API,参数是 Function 函数式接口.collect(Collectors.toList()); // 4. collect 属于 Stream API,Collector 工具类
  • Stream API 负责“流水线”语法:.stream()、.filter()、.map()、.collect()。
  • 函数式接口 负责“把代码当数据传”:s -> s != null、String::toUpperCase。

LEVEL-1 扔掉 for-each

把“循环”变成“管道”:源 → 中间操作 → 收集。

List<Result> result = list.stream()      // 源.filter(Objects::nonNull)           // 中间.map(this::toResult)                // 中间.collect(Collectors.toList());      // 收集
  • 常见坑
    忘记 collect——流是“蓝图”,不收集就不会执行。

LEVEL-2 搞定分组/去重/统计

收集器 Collectors 就是“SQL 里的 GROUP BY、DISTINCT、COUNT”。

// 分组
Map<K, List<T>> group = list.stream().collect(Collectors.groupingBy(T::getK));// 去重(按 key)
Map<K, T> unique = list.stream().collect(Collectors.toMap(T::getK,          // keyFunction.identity(), // value(old, nw) -> nw));   // 冲突留新// 统计
IntSummaryStatistics st = list.stream().collect(Collectors.summarizingInt(T::getScore));
int max = st.getMax();
  • 常见坑
    toMap 遇到重复 key 直接抛异常;必须给第三个参数(合并函数)。

LEVEL-3 链式 Optional + 自定义收集器

Optional 当“防空指针链”,自定义收集器当“通用算法模板”。

// 防空指针链
String name = Optional.ofNullable(dto).map(DTO::getOrder).map(Order::getCustomer).map(Customer::getName).orElse("UNKNOWN");// 自定义收集器:把 stream → LinkedHashSet(保持顺序又去重)
Collector<Integer, ?, Set<Integer>> orderedDistinct =Collector.of(LinkedHashSet::new,   // 供应器Set::add,             // 累加器(left, right) -> { left.addAll(right); return left; }, // 组合器Function.identity()); // 完成器
Set<Integer> orderNoDup = nums.stream().collect(orderedDistinct);
  • 常见坑
    Optional 不要 get() 直接拆包;用 orElse/orElseThrow 结束。
    自定义收集器里,如果容器是线程不安全(如 ArrayList),千万别并行 parallelStream()。
http://www.dtcms.com/a/389746.html

相关文章:

  • 【DMA】DMA实战:用DMA操控外设
  • 深入理解传输层协议:UDP 与 TCP 的核心原理与应用
  • 教育行业数字化资料管理:构建安全合规、高效协同的一体化知识共享平台
  • Smart Launcher安卓版(安卓桌面启动器):安卓设备的智能启动器
  • Ansible如何写Callback 插件
  • 自动化测试框架需要具备哪些功能?
  • Pix2Pix中的对抗损失与L1损失:高频细节与低频结构的平衡艺术
  • mkcert生成证书本地或内网使用https
  • 【Python】关于移除Conda中已搭建环境的相关问题
  • 基于SpringBoot+Vue的校园兼职管理系统(WebSocket及时通讯、地图API、Echarts图形化分析)
  • 【K8S默认容器运行时】
  • Makefile学习(二)- 语法(变量、伪目标)
  • Winform自定义无边框窗体
  • 文献综述是什么?怎么写好一篇综述?
  • CLIP:开启多模态AI新时代的密钥(上)
  • @[TOC](位运算) # 常见位运算总结
  • 【Block总结】sMLP,全新的“稀疏MLP”模块|即插即用|原模型改进
  • TDengine IDMP 基本功能——数据可视化(4. 仪表盘)
  • 亚信安全与中国联通共同打造的联通联信一体化安全检测与响应平台亮相网安周
  • 短脉冲计数
  • 铝厂天车PLC远程调试解决方案:御控物联网网关赋能工业智造新生态
  • CPU-GPU预处理流程的核心和优化关键 格式流转
  • 混元开源之力:spring-ai-hunyuan 项目功能升级与实战体验
  • 基于开源AI大模型、AI智能名片与S2B2C商城小程序的社群入群仪式设计研究
  • HookConsumerWidget 深入理解
  • Django多数据库实战:Mysql从逻辑隔离到跨库外键问题的解决方案
  • SQL Server索引优化:从原理到实战的完整指南
  • 前端-Vue自定义指令
  • 深度学习调参核心:PyTorch学习率调整策略全解析(一)(附系列PPT关键要点)
  • 如何在保证质量的前提下,快速完成一份 PPT?