当前位置: 首页 > 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.dtcms.com/a/305756.html

相关文章:

  • Redis 面试全解析:从数据结构到集群架构(含实战解决方案)
  • 《Java 程序设计》第 10 章 - 接口与 Lambda 表达式
  • #C语言——学习攻略:深挖指针路线(四续)——函数指针数组--转移表
  • 【支持Ubuntu22】Ambari3.0.0+Bigtop3.2.0——Step4—时间同步(Chrony)
  • 从0开始学习R语言--Day62--RE插补
  • STL学习(?、常用的算数算法和集合算法)
  • 跳跃表可视化深度解析:动态演示数据结构核心原理
  • 数据结构第3问:什么是线性表?
  • 数据结构-Set集合(一)Set集合介绍、优缺点
  • 基于 Rust 和土木工程、设备故障诊断、混凝土养护、GPS追踪、供应链物流跟踪系统、地下水监测等领域的实例
  • CouchDB 从入门到精通:构建高效的分布式文档数据库
  • cpp实现音频重采样8k->16k及16k->8k
  • 2025年华为HCIA-AI认证是否值得考?还是直接冲击HCIP?
  • c++函数返回值完整总结
  • GaussDB 数据库架构师(十二) 数据库对象修改审计设置
  • (RedmiBook)上禁用触摸板或自带键盘
  • 【LangGraph技术深度解析】构建下一代AI工作流的革命性框架
  • 数据赋能(358)——数据分析——可解释性原则
  • ZKMall商城开源本地部署指南
  • 【Rust多进程】征服CPU的艺术:Rust多进程实战指南
  • 2419. 按位与最大的最长子数组
  • web服务器nginx
  • 新零售“实—虚—合”逻辑下的技术赋能与模式革新:基于开源AI大模型、AI智能名片与S2B2C商城小程序源码的研究
  • 标准七层网络协议和TCP/IP四层协议的区别
  • uni-app webview 的message无法触发的解决方案
  • 在 Elasticsearch 8.19 和 9.1 中引入更强大、更具弹性和可观测性的 ES|QL
  • jenkins连接docker失败【还是没解决】
  • 关于MyBatis 的懒加载(Lazy Loading)机制
  • Hutool 的 WordTree(敏感词检测)
  • 阿里云AI代码助手通义灵码开发指导