在Java 8及更高版本中引入的Stream API是处理集合数据的强大工具,其中map
和flatMap
是两个常用的操作,它们用于转换流中的元素。
map:
map
函数可以看作是对流中的每一个元素应用一个函数,将元素转换成新的形式。你可以把它想象成你在厨房里准备食材的过程。假设你有一篮子苹果,你想把它们变成苹果片。在这个过程中,你拿一个苹果,切成片,然后放回篮子里。map
就是做类似的事情,只不过它是对数据进行操作。
例子: 假设你有一个字符串列表,你想将它们全部转换成大写。你可以使用map
来实现:
List<String> words = Arrays.asList("ai", "wenwen", "fifi");
List<String> upperCaseWords = words.stream()
.map(String::toUpperCase)
.collect(Collectors.toList());
这里的map(String::toUpperCase)
会对流中的每一个字符串应用toUpperCase
方法,转换成大写后再收集到新的列表中。
flatMap:
flatMap
函数则更进一步,它不仅转换流中的元素,而且还会扁平化结果。这就像你在厨房里处理一篮子苹果,但这次篮子里装的不是单个苹果,而是装着苹果的小袋子。flatMap
会先打开每个小袋子,取出苹果,然后切片,最后把所有的苹果片放在一起,而不是保留原来的袋子结构
假设你有一个列表,列表中的每个元素也是一个列表(嵌套列表)。你想把这些嵌套的列表“摊平”成一个单一的列表。flatMap
可以帮你做到:
List<List<Integer>> nestedList = Arrays.asList(
Arrays.asList(1, 2),
Arrays.asList(3, 4),
Arrays.asList(5)
);
List<Integer> flatList = nestedList.stream()
.flatMap(List::stream)
.collect(Collectors.toList());
在这个例子中,flatMap(List::stream)
会将每个内部列表转换为流,然后将这些流合并成一个大的流,最后收集到一个单一的列表中。
总的来说,map
和flatMap
都是用于转换流中的数据,但flatMap
还能处理嵌套的数据结构,将它们扁平化。