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

【Lambda】flatMap使用案例

【Lambda】flatMap使用案例

    • 【1】案例一
    • 【2】案例 2:处理对象中的集合属性
    • 【3】案例 3:二维列表转一维列表
    • 【4】案例 4:过滤并展开嵌套集合

【1】案例一

(1)需求描述
一个用户对象有一个角色的List,如何使用Stream根据一个用户对象集合,返回每个角色对应的所有用户List的Map

(2)代码示例

import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.AbstractMap.SimpleEntry;
import java.util.stream.Collectors;// 用户类定义
class User {private String username;private List<String> roles;public User(String username, List<String> roles) {this.username = username;this.roles = roles;}// Getter方法public String getUsername() {return username;}public List<String> getRoles() {return roles;}@Overridepublic String toString() {return username;}
}public class UserRoleMapper {public static void main(String[] args) {// 构建示例用户集合List<User> users = new ArrayList<>();users.add(new User("张三", List.of("管理员", "编辑")));users.add(new User("李四", List.of("编辑", "访客")));users.add(new User("王五", List.of("访客")));users.add(new User("赵六", List.of("管理员")));// 转换为角色到用户列表的MapMap<String, List<User>> roleToUsersMap = users.stream()// 第一步:将每个用户拆分为(角色, 用户)的键值对流.flatMap(user -> user.getRoles().stream().map(role -> new SimpleEntry<>(role, user)))// 第二步:按角色分组,收集用户到List.collect(Collectors.groupingBy(SimpleEntry::getKey,  // 按角色(键)分组Collectors.mapping(SimpleEntry::getValue,  // 提取用户(值)Collectors.toList()     // 收集为List<User>)));// 打印结果roleToUsersMap.forEach((role, userList) -> System.out.println(role + ": " + userList));}
}

【2】案例 2:处理对象中的集合属性

假有一个 Student 类,每个学生选修多门课程(List),需获取所有学生的全部课程(去重)。

import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;// 学生类
class Student {private String name;private List<String> courses;public Student(String name, List<String> courses) {this.name = name;this.courses = courses;}public List<String> getCourses() {return courses;}
}public class FlatMapStudentDemo {public static void main(String[] args) {List<Student> students = Arrays.asList(new Student("张三", Arrays.asList("数学", "英语")),new Student("李四", Arrays.asList("英语", "物理")),new Student("王五", Arrays.asList("物理", "化学")));// 使用flatMap提取所有课程并去重List<String> allCourses = students.stream()// 每个学生的课程列表转换为流.flatMap(student -> student.getCourses().stream()).distinct() // 去重.collect(Collectors.toList());System.out.println(allCourses);// 输出:[数学, 英语, 物理, 化学]}
}

flatMap 将每个学生的 courses 列表转换为流,再合并成一个包含所有课程的流,最终通过 distinct() 去重。

【3】案例 3:二维列表转一维列表

将嵌套的二维列表(List<List>)转换为一维列表(List)。

import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;public class FlatMap2DListDemo {public static void main(String[] args) {List<List<Integer>> twoDList = Arrays.asList(Arrays.asList(1, 2, 3),Arrays.asList(4, 5, 6),Arrays.asList(7, 8, 9));// 扁平化二维列表List<Integer> oneDList = twoDList.stream().flatMap(list -> list.stream()) // 每个子列表转换为流并合并.collect(Collectors.toList());System.out.println(oneDList);// 输出:[1, 2, 3, 4, 5, 6, 7, 8, 9]}
}

flatMap 遍历二维列表中的每个子列表,将其转换为流后合并,直接得到一维列表,避免了嵌套循环。

【4】案例 4:过滤并展开嵌套集合

有一个订单列表,每个订单包含多个商品,需筛选出价格大于 100 的商品并收集。

import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;// 商品类
class Product {private String name;private double price;public Product(String name, double price) {this.name = name;this.price = price;}public double getPrice() {return price;}@Overridepublic String toString() {return name + "(" + price + ")";}
}// 订单类
class Order {private List<Product> products;public Order(List<Product> products) {this.products = products;}public List<Product> getProducts() {return products;}
}public class FlatMapOrderDemo {public static void main(String[] args) {List<Order> orders = Arrays.asList(new Order(Arrays.asList(new Product("手机", 5999),new Product("耳机", 299))),new Order(Arrays.asList(new Product("键盘", 99),new Product("鼠标", 59))));// 筛选出所有价格 > 100 的商品List<Product> expensiveProducts = orders.stream()// 展开所有订单中的商品.flatMap(order -> order.getProducts().stream())// 过滤价格 > 100 的商品.filter(product -> product.getPrice() > 100).collect(Collectors.toList());System.out.println(expensiveProducts);// 输出:[手机(5999.0), 耳机(299.0)]}
}

先通过 flatMap 将所有订单的商品合并为一个商品流,再用 filter 筛选出价格符合条件的商品。

http://www.xdnf.cn/news/1211743.html

相关文章:

  • 字节跳动“扣子”(Coze)开源:AI智能体生态的技术革命
  • 从结构到交互:HTML5进阶开发全解析——语义化标签、Canvas绘图与表单设计实战
  • 微软OpenAI展开深入谈判
  • DIV 指令概述
  • 视觉语言模型在视觉任务上的研究综述
  • HTML第一次作业
  • JavaWeb 进阶:Vue.js 与 Spring Boot 全栈开发实战(Java 开发者视角)
  • 【数据结构初阶】--二叉树(四)
  • Prometheus-1--什么是Prometheus?
  • Docker网络技术深度研究与实战手册
  • C++类中动态内存分配注意手册
  • 基于springboot的零食商城的设计与实现/零食销售系统的设计与实现
  • 每日学习笔记记录(分享更新版-凌乱)
  • LeetCode 11 - 盛最多水的容器
  • Vue.js 指令系统完全指南:深入理解 v- 指令
  • python的进程、线程、锁
  • DNS污染与劫持
  • Wndows Docker Desktop-Unexpected WSL error错误
  • 项目历程—生命数组游戏(两版本)
  • Vulkan入门教程 | 第二部分:创建实例
  • “非参数化”大语言模型与RAG的关系?
  • 并查集介绍及典型应用和编程题
  • [Linux入门] Linux 部署本地 APT 仓库及 NFS 共享服务全攻略
  • ITIL 4 高速IT:解耦架构——构建快速迭代的技术基座
  • 【LeetCode 随笔】
  • centos7安装Docker
  • 基于三台主机搭建 Web 服务环境:Nginx、NFS 与 DNS 配置全流程
  • 【牛客网C语言刷题合集】(五)——主要二进制、操作符部分
  • SQL158 每类视频近一个月的转发量/率
  • C++:stack与queue的使用