Java Stream API介绍

场景

为了更便捷的操作集合,java8 引入Stream核心特性,它提供了一种声明式处理数据集合的方式。

使用步骤

创建Stream

‌集合创建‌:List.stream()、Set.stream()

‌数组创建‌:Arrays.stream(array)

‌静态方法‌:Stream.of()、Stream.iterate()、Stream.generate()‌

中间操作

map() - 元素转换‌

java 复制代码
List<Integer> numbers = Arrays.asList(1, 2, 3);
List<Integer> doubled = numbers.stream()
    .map(x -> x * 2)
    .collect(Collectors.toList());
// 结果:[2, 4, 6]

‌filter() - 元素过滤‌

java 复制代码
List<String> cities = Arrays.asList("北京", "上海", "广州", "深圳");
List<String> filtered = cities.stream()
    .filter(city -> city.startsWith("北"))
    .collect(Collectors.toList());
// 结果:["北京"]‌:ml-citation{ref="5" data="citationList"}

groupingBy()分组操作

‌1. 字段分组‌

java 复制代码
List<User> users = Arrays.asList(
    new User("张三", "技术部"),
    new User("李四", "技术部"), 
    new User("王五", "市场部")
);

Map<String, List<User>> deptGroup = users.stream()
    .collect(Collectors.groupingBy(User::getDepartment));
// 结果:{"技术部": [张三, 李四], "市场部": [王五]}

‌2. 分组计数‌

java 复制代码
Map<String, Long> deptCount = users.stream()
    .collect(Collectors.groupingBy(User::getDepartment, Collectors.counting()));
// 结果:{"技术部": 2, "市场部": 1}

去重操作

‌1. 基本类型去重‌

java 复制代码
List<Integer> numbers = Arrays.asList(1, 2, 2, 3, 1);
List<Integer> distinctNumbers = numbers.stream()
    .distinct()
    .collect(Collectors.toList());
// 结果:[1, 2, 3]

‌2. 对象属性去重‌

java 复制代码
// 方法一:使用 distinct() + 重写 equals/hashCode
List<User> distinctUsers = users.stream()
    .distinct()
    .collect(Collectors.toList());

// 方法二:使用 TreeSet(推荐)
List<User> distinctByName = users.stream()
    .collect(Collectors.collectingAndThen(
        Collectors.toCollection(() -> new TreeSet<>(
            Comparator.comparing(User::getName)))),
        ArrayList::new));

终结操作

‌collect() - 结果收集‌

java 复制代码
// List 转 Map
List<User> users = Arrays.asList(new User(1, "张三"), new User(2, "李四"));
Map<Integer, String> userMap = users.stream()
    .collect(Collectors.toMap(User::getId, User::getName));‌

统计操作‌

java 复制代码
List<Integer> nums = Arrays.asList(1, 2, 3, 4, 5);

long count = nums.stream().count();           // 元素个数:5
int sum = nums.stream().mapToInt(i -> i).sum(); // 求和:15
Optional<Integer> max = nums.stream().max(Integer::compare); // 最大值:5‌
相关推荐
小蒜学长几秒前
springboot党建云课堂学习与管理系统(代码+数据库+LW)
java·数据库·spring boot·后端·学习
超级码里奥20242 分钟前
OpenClaw(龙虾[特殊字符])AI 智能体安装教程
windows·node.js
烂蜻蜓6 分钟前
Flask入门教程(十六):中间件与扩展——增强应用功能的两种机制
python·中间件·flask
mldong12 分钟前
六语言引擎实现对比:同构背后的妥协与差异
java·架构
烂蜻蜓2 小时前
Flask入门教程(十二):表单处理——从基础到Flask-WTF完整实践
后端·python·flask
jay神2 小时前
【计算机毕业设计】基于Flask+Vue的电影数据可视化与智能推荐系统
前端·vue.js·python·信息可视化·flask·毕业设计·课程设计
满怀冰雪3 小时前
24-PaddleClas 模型评估、导出与推理部署入门
大数据·人工智能·python·深度学习·paddle
DeepVisionary8 小时前
谷歌 Gemini Omni 1.1 Flash 正式发布:4K 视频、40 秒场景延伸,视频生成进入按 token 计费时代
python·自动化
阡之尘埃9 小时前
Python数据分析案例85——大模型微调全流程(SFT的LoRA微调)
人工智能·python·深度学习·语言模型·llm·微调·千问