目录
- 背景和价值
- 1. map 用法
- 2. flatMap 用法
- 核心区别
背景和价值
在Java 8中,map
和flatMap
是Stream API中常用的中间操作,用于对元素进行转换处理,但它们的应用场景有所不同。
1. map 用法
map
方法用于将流中的每个元素通过一个函数转换为另一个对象,最终生成一个包含转换后元素的新流,新流的元素数量与原流相同。
示例代码:
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;public class MapExample {public static void main(String[] args) {List<String> words = Arrays.asList("apple", "banana", "cherry");// 将每个字符串转换为其长度List<Integer> wordLengths = words.stream().map(String::length) // 等价于 s -> s.length().collect(Collectors.toList());System.out.println(wordLengths); // 输出: [5, 6, 6]}
}
在这个例子中,map(String::length)
将流中的每个字符串转换为它的长度,输入流是String
类型,输出流是Integer
类型。
2. flatMap 用法
flatMap
方法用于将流中的每个元素转换为一个流,然后将所有这些流"扁平化"合并成一个单一的流。它适用于处理元素本身是集合或数组的情况。
示例代码:
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;public class FlatMapExample {public static void main(String[] args) {List<String> sentences = Arrays.asList("Hello world", "Java 8 stream", "map and flatMap");// 将每个句子拆分成单词,并合并成一个单词流List<String> words = sentences.stream().flatMap(sentence -> Arrays.stream(sentence.split(" "))).collect(Collectors.toList());System.out.println(words); // 输出: [Hello, world, Java, 8, stream, map, and, flatMap]}
}
在这个例子中:
- 首先对每个句子调用
split(" ")
得到字符串数组 Arrays.stream()
将数组转换为流flatMap
将所有这些流合并成一个包含所有单词的流
核心区别
map
:Stream<T> → Stream<R>
(一对一转换,元素数量不变)flatMap
:Stream<T> → Stream<R>
(一对多转换后再合并,元素数量可能变化)
简单来说,当你的转换函数返回一个单一元素时使用map
,当返回一个集合或流时使用flatMap
来"扁平化"结果。