面试官:Java 8 map 和 flatMap 的区别?大部分人答不上来!

简介: 背景栈长面试会经常问 Java 8 map 和 flatMap 的区别,大部分人都答不上来,会用 map 的都不多,还有一部分人甚至都不知道这两个玩意是干嘛用的,有的还以为我问 HashMap 和 FlatMap。。

背景

栈长面试会经常问 Java 8 map 和 flatMap 的区别,大部分人都答不上来,会用 map 的都不多,还有一部分人甚至都不知道这两个玩意是干嘛用的,有的还以为我问 HashMap 和 FlatMap。。


这里所问的 map 和 flatMap 并不是集合,它们都是 Stream 流接口中的方法,如果你没用过,我估计在座的各位也有点晕,那么今天栈长就给大家扫个盲,以实际案例来剖析这两个玩意,让你面试的时候再也不怕问了!


如图所示:

image.png

在 Java 8 Stream(流)接口中有 8 个特别有意思的方法,其实就是分为两大类:


map


flatMap


现在知道这两个玩意的来路了吧?!


其中,xxToXxx 就是转换为不同的类型的流。另外,Stream 系列我之前写过一个专题了,这里不再展开,不懂的关注公众号Java技术栈,然后在公众号 Java 教程菜单中阅读。


map

map 方法的作用:


对流中的每个元素进行转换


比如现在有一个 List<String> 集合:


private static List<String> LIST = Arrays.asList("h

我想让每个元素后面都加上 "---":

/**
 * map 转换
 * @author: 栈长
 * @from: 公众号Java技术栈
 */
private static void map() {
    List<String> mapList = LIST.stream().map(e -> e.concat("---")).collect(Collectors.toList());
    mapList.forEach(System.out::print);
    System.out.println("\nmap list size: " + mapList.size());
    System.out.println();
}1.

1)先把 List 转换为 Stream;


2)调用 Stream.map 方法对 Stream 中的每个元素再封装操作一遍;


3)把 Stream<Stream> 转换为 List;


输出结果:


=====map list===== https://---www---.---javastack---.---cn--- map list size: 6


结果符合预期。


另外,我将 Java 8知识点我也整理到了小程序,都是面试常考的,大家可以在Java面试库小程序在线刷题。


如果 List 中的元素都是整数型:


private static List<String> NUMBERS_LIST = Arrays.asList("22", "19", "89", "90");

那么就可以 直接使用内置的 mapToXxx 方法,这里以 mapToLong 演示:

image.png

<R> Stream<R> map(Function<? super T, ? extends R> mapper);

LongStream mapToLong(ToLongFunction<? super T> mapper);

map 和 mapToXxx 的返回类型是不一样的。


本文所有完整示例源代码已经上传:


https://github.com/javastacks/javastack


flatMap

flatMap 方法的作用:


flat 是平铺的意思,flatMap 即对流中每个元素进行平铺后,形成多个流合在一起


比如现在有 3 个字符串数组:

image.png

<R> Stream<R> map(Function<? super T, ? extends R> mapper);

<R> Stream<R> flatMap(Function<? super T, ? extends Stream<? extends R>> mapper);

其参数是不一样的,map 前、后的每个元素都是 R 类型,flatMap 前、后的每个元素由原来的 R 类型都变成了 Stream 类型。


再小小总结下:


map 适用于对每个元素进行简单的转换,flatMap 适用于对数组流进行平铺后合并,两个方法的应用场景不一样。


所以,你学废了吗?赶紧用在项目中吧,提升自己的硬实力,让同事对你刮目相看!再啰嗦一句,对 Java 8 新增的知识点还不会用的可以关注公众号:Java技术栈,在后台回复:java,Java 8+ 系列教程我都写了一堆了。


本文所有完整示例源代码已经上传:


https://github.com/javastacks/javastack


欢迎 Star 学习,后面 Java 示例都会在这上面提供!


好了,今天的分享就到这里了,后面栈长会分享更多好玩的 Java 技术和最新的技术资讯,关注公众号Java技术栈第一时间推送,我也将主流 Java 面试题和参考答案都整理好了,在公众号后台回复关键字 "面试" 进行刷题。


最后,觉得我的文章对你用收获的话,动动小手,给个在看、转发,原创不易,栈长需要你的鼓励。

目录
相关文章
|
11月前
|
存储 缓存 JavaScript
Set和Map有什么区别?
Set和Map有什么区别?
713 1
|
12月前
|
缓存 Java 关系型数据库
2025 年最新华为 Java 面试题及答案,全方位打造面试宝典
Java面试高频考点与实践指南(150字摘要) 本文系统梳理了Java面试核心考点,包括Java基础(数据类型、面向对象特性、常用类使用)、并发编程(线程机制、锁原理、并发容器)、JVM(内存模型、GC算法、类加载机制)、Spring框架(IoC/AOP、Bean生命周期、事务管理)、数据库(MySQL引擎、事务隔离、索引优化)及分布式(CAP理论、ID生成、Redis缓存)。同时提供华为级实战代码,涵盖Spring Cloud Alibaba微服务、Sentinel限流、Seata分布式事务,以及完整的D
657 1
|
10月前
|
Java 测试技术
Java浮点类型详解:使用与区别
Java中的浮点类型主要包括float和double,它们在内存占用、精度范围和使用场景上有显著差异。float占用4字节,提供约6-7位有效数字;double占用8字节,提供约15-16位有效数字。float适合内存敏感或精度要求不高的场景,而double精度更高,是Java默认的浮点类型,推荐在大多数情况下使用。两者都存在精度限制,不能用于需要精确计算的金融领域。比较浮点数时应使用误差范围或BigDecimal类。科学计算和工程计算通常使用double,而金融计算应使用BigDecimal。
3665 102
|
9月前
|
算法 Java
50道java集合面试题
50道 java 集合面试题
|
11月前
|
存储 缓存 人工智能
Java int和Integer的区别
本文介绍了Java中int与Integer的区别及==与equals的比较机制。Integer是int的包装类,支持null值。使用==比较时,int直接比较数值,而Integer比较对象地址;在-128至127范围内的Integer值可缓存,超出该范围或使用new创建时则返回不同对象。equals方法则始终比较实际数值。
368 0
|
11月前
|
缓存 Java API
Java 面试实操指南与最新技术结合的实战攻略
本指南涵盖Java 17+新特性、Spring Boot 3微服务、响应式编程、容器化部署与数据缓存实操,结合代码案例解析高频面试技术点,助你掌握最新Java技术栈,提升实战能力,轻松应对Java中高级岗位面试。
683 0
|
9月前
|
安全 Java API
Java SE 与 Java EE 区别解析及应用场景对比
在Java编程世界中,Java SE(Java Standard Edition)和Java EE(Java Enterprise Edition)是两个重要的平台版本,它们各自有着独特的定位和应用场景。理解它们之间的差异,对于开发者选择合适的技术栈进行项目开发至关重要。
1502 1
|
11月前
|
Java 数据库连接 数据库
Java 相关知识点总结含基础语法进阶技巧及面试重点知识
本文全面总结了Java核心知识点,涵盖基础语法、面向对象、集合框架、并发编程、网络编程及主流框架如Spring生态、MyBatis等,结合JVM原理与性能优化技巧,并通过一个学生信息管理系统的实战案例,帮助你快速掌握Java开发技能,适合Java学习与面试准备。
491 2
Java 相关知识点总结含基础语法进阶技巧及面试重点知识
|
9月前
|
算法 Java
50道java基础面试题
50道java基础面试题

热门文章

最新文章