栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Java 8 map 和 flatMap 的区别?看完你就明白了

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Java 8 map 和 flatMap 的区别?看完你就明白了

背景

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

这里所问的 map 和 flatMap 并不是集合,它们都是 Stream 流接口中的方法,如果你没用过,我估计在座的各位也有点晕!

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

  • map
  • flatMap

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

map

map 方法的作用:

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

比如现在有一个 List 集合:

private static List LIST = Arrays.asList("https://", "www", ".", "javastack", ".", "cn");

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

private static void map() {
    List 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)先把 List 转换为 Stream;

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

3)把 Stream 转换为 List;

结果符合预期。

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

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

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

private static void mapToLong() {
    System.out.println("=====map to long list=====");
    List longList = NUMBERS_LIST.stream().mapToLong(Long::valueOf).boxed().collect(Collectors.toList());
    longList.forEach(System.out::println);
    System.out.println("map to long list size: " + longList.size());
    System.out.println();
}

1)先把 List 转换为 Stream;

2)调用 Stream.mapToLong 方法把流转换为 LongStream 类型;

3)调用 LongStream.boxed 方法收集为 Stream 类型;

4)把 Stream 转换为 List;

输出结果:

=====map to long list=====
22
19
89
90
map to long list size: 4

当然这个使用 map 也能实现,但使用 mapToXxx 可以将原始流(Stream)转换为 XxxStream

XxxStream 可以有更多基于整数型的功能,比如快速对元素进行汇总(sum)、求最大数(max)、最小数(min)等等,如果要涉及到元素计算,使用 mapToXxx 会更香。

如源码所示:

 Stream map(Function mapper);
LongStream mapToLong(ToLongFunction mapper);

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

flatMap

flatMap 方法的作用:

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

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

String[] arr1 = {"https://", "www", ".", "javastack", ".", "cn"};
String[] arr2 = {"1", ":", "2"};
String[] arr3 = {"3", ":", "4"};

现在直接转换为 Stream:

System.out.println("=====arrays list=====");
List list = Stream.of(arr1, arr2, arr3).collect(Collectors.toList());
list.forEach(System.out::print);
System.out.println("narrays list size: " + list.size());
System.out.println();

没错,是 3 个数组元素。

再来看使用 flatMap 方法的效果:

System.out.println("=====flatmap list=====");
List mapList = list.stream().flatMap(Arrays::stream).collect(Collectors.toList());
mapList.forEach(System.out::print);
System.out.println("nflatmap list size: " + mapList.size());
System.out.println();

元素大小变成了 12,把 3 个数组流中的元素全部平铺合到一个流中了,然后流中总共为 12 个元素。

这里我用的数组类型,如果是多个 List 类型也是可以的,其底层也是数组,只要能将元素转换成流都是可以的。

总结

map 是对流元素进行转换,flatMap 是对流中的元素(数组)进行平铺后合并,即对流中的每个元素平铺后又转换成为了 Stream 流。

来看下两个方法的源码:

 Stream map(Function mapper); Stream flatMap(Function> mapper);

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

如果你想开发小程序或者了解更多小程序的内容,可以通过专业开发公司,来帮助你实现开发需求:厦门在乎科技-专注厦门小程序开发公司、APP开发、网站开发、H5小游戏开发

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/591932.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号