Java基础之Java8中map和flatMap的使用

一、介绍

首先,看下map和flatMap的官方文档说明

  1. map

  1. flatMap


其实单纯的看api说明还是比较抽象,下面我将以几个实战例子来帮助我们理解。然后再回过头来看它的说明,就会有一种恍然大悟的感觉。

二、使用

  1. map示例

字母大小写

    public static void main(String[] args) throws Exception {// 将集合中的所有的小写字母转为大写字母List<String> list = new ArrayList<>();list.add("hello");list.add("world");list.add("java");list.add("python");List<String> result = list.stream().map(String::toUpperCase).collect(Collectors.toList());System.out.println(result);}

输出结果如下:

[HELLO, WORLD, JAVA, PYTHON]

平方数

public static void main(String[] args) throws Exception {// 求集合中每个元素的平方数List<Integer> nums = Arrays.asList(1, 2, 3, 4);List<Integer> result = nums.stream().map(n -> n * n).collect(Collectors.toList());System.out.println(result);}

输出结果如下:

[1, 4, 9, 16]

从上面例子可以看出,map 生成的是个 1:1 映射,每个输入元素,都按照规则转换成为另外一个元素。还有一些场景,是一对多映射关系的,这时需要 flatMap。

  1. flatMap示例

单词提取

    public static void main(String[] args) throws Exception {// 将集合中的字符串中单词提取出来,不考虑特殊字符List<String> words = Arrays.asList("hello c++", "hello java", "hello python");List<String> result = words.stream()// 将单词按照空格切合,返回Stream<String[]>类型的数据.map(word -> word.split(" "))// 将Stream<String[]>转换为Stream<String>.flatMap(Arrays::stream)// 去重.distinct().collect(Collectors.toList());System.out.println(result);}

输出结果如下:

[hello, c++, java, python]

元素抽取

public class Main {public static void main(String[] args) throws Exception {// 初始化测试数据List<String> hobby1 = Arrays.asList("java", "c", "音乐");List<String> hobby2 = Arrays.asList("c++", "c", "游戏");User user1 = new User(1, "张三", hobby1);User user2 = new User(2, "李四", hobby2);ArrayList<User> users = new ArrayList<>();users.add(user1);users.add(user2);// 将集合中每个用户的爱好进行计算,取并集List<String> result = users.stream().map(user -> user.hobby).flatMap(Collection::stream).distinct().collect(Collectors.toList());System.out.println(result);}static class User {int id;String name;List<String> hobby;public User(int id, String name, List<String> hobby) {this.id = id;this.name = name;this.hobby = hobby;}@Overridepublic boolean equals(Object o) {if (this == o) return true;if (o == null || getClass() != o.getClass()) return false;User user = (User) o;return id == user.id &&Objects.equals(name, user.name);}@Overridepublic int hashCode() {return Objects.hash(id, name);}@Overridepublic String toString() {return "User{" +"id=" + id +", name='" + name + '\'' +'}';}}
}

输入结果如下:

[java, c, 音乐, c++, 游戏]

flatMap 把 input Stream 中的层级结构扁平化,就是将最底层元素抽出来放到一起,最终 output 的新 Stream 里面已经没有 List 了,都是直接的数字.

三、map和flatMap的原理图示

  1. map原理图

对于Stream中包含的元素使用给定的转换函数进行转换操作,新生成的Stream只包含转换生成的元素。这个方法有三个对于原始类型的变种方法,分别是:mapToInt,mapToLong和mapToDouble。这三个方法也比较好理解,比如mapToInt就是把原始Stream转换成一个新的Stream,这个新生成的Stream中的元素都是int类型。之所以会有这样三个变种方法,可以免除自动装箱/拆箱的额外消耗。

  1. flatMap原理图

和map类似,不同的是其每个元素转换得到的是Stream对象,会把子Stream中的元素压缩到父集合中

Java基础之Java8中map和flatMap的使用相关推荐

  1. Java基础之Java8中Map的compute的使用

    Java基础之Java8中Map的compute的使用 一.介绍 Java8更新后,Map接口中提供了compute方法.下面我们先看看官方文档的对它的使用说明. 如果看完上面的还是不太明白的话,看下 ...

  2. Java8中map与flatMap用法

    目录 1 概述 2 map与flatMap 3 常用写法 1 概述 Java8中一些新特性在平时工作中经常会用到,但有时候总感觉不是很熟练,今天特意将这个Java8中的映射记录一下. 2 map与fl ...

  3. java8 flatmap与map_java8中map和flatMap区别

    1.函数定义比较 map注释: /** * Returns a stream consisting of the results of applying the given * function to ...

  4. java flatmapfunction_Java Stream中map和flatMap方法

    最近看到一篇讲stream语法的文章,学习Java中map()和flatMap()方法之间的区别. 虽然看起来这两种方法都做同样的事情,都是做的映射操作,但实际上差之毫厘谬以千里. 通过演示Demo中 ...

  5. Java基础之Java8 新特性

    hp实训8.19_Java基础之Java8新特性 // 信息展示方法 ,接口中,就可以提供一种实现. 就可以使用这种功能.default void print() {System.out.printl ...

  6. stream map方法_Java Stream中map和flatMap方法

    最近看到一篇讲stream语法的文章,学习Java中map()和flatMap()方法之间的区别. 虽然看起来这两种方法都做同样的事情,都是做的映射操作,但实际上差之毫厘谬以千里. 通过演示Demo中 ...

  7. 【JAVA基础】java基础之-java8新特性

    写在前面的话 脑子是个好东西,可惜的是一直没有搞懂脑子的内存删除机制是什么,所以啊,入行多年,零零散散的文章看了无数,却总是学习了很多也忘了很多. 痛定思痛的我决定从今天开始系统的梳理下知识架构,记录 ...

  8. java flatmap_Java 8 Steam API map和flatMap方法使用详解

    java 8 stream api 中有两个方法map和flatMap非常实用,应用场景也非常广泛,能极大提升编程效率.下面我们详细介绍一下这两个方法的用法. map方法 我们来看个示例:把一个整数列 ...

  9. java8中map的新方法--replace

    译者:kingviker Map在Java8中新增了两个replace的方法 1.replace(k,v) 在指定的键已经存在并且有与之相关的映射值时才会将指定的键映射到指定的值(新值) 在指定的键不 ...

最新文章

  1. python气象数据可视化_python grib气象数据可视化
  2. WdatePicker,js日期插件 ,时间相加
  3. 如何编写一个npm包,可以公共使用?
  4. 如何用PPT编制方案 (2)PPT内容的逻辑表达
  5. Elasticsearch 数据写入原理
  6. hdu 4296 Buildings (贪心)
  7. 2018-2019-2 网络对抗技术 20165227 Exp4 恶意代码分析
  8. 一个适合于.NET Core的超轻量级工作流引擎:Workflow-Core
  9. Linux下Nginx+Tomcat整合的安装与配置
  10. 利用泛型与反射更新实体(ADO.NET Entity Framework)
  11. Matplotlib 全部笔记的思维导图精简记忆版
  12. 云计算、雾计算、边缘计算、移动边缘计算和自动驾驶的关系
  13. 群晖Docker部署Calibre Web打造全功能书库
  14. 获取UI控件位置信息
  15. linux 根目录变为只读了,如何在 Web 服务器文档根目录上设置只读文件权限 | Linux 中国...
  16. uo和o的区别和用法_拼音o与uo如何区别使用
  17. vue 根据后台提供的值判断登录、未登录状态
  18. 蚂蚁森林师生执念种上万棵树
  19. 原车屏升级芯片方案:GM8905C和GM8906C替代DS90UR905和DS90UR906!
  20. 地球投影的分类和实例

热门文章

  1. 月光宝盒(vivo流量录制回放平台)正式对外开源
  2. java如何开启远程调试服务端口_Java远程调试
  3. Linux环境Release版本的符号表剥离及调试方法
  4. 一个好的产品是如何做好兼容性测试的?
  5. 设置多行省略号-webkit-line-clamp
  6. 【Java内存溢出排查】gc监测以及内存突增问题排查
  7. 前端随记---文件下载启用浏览器下载和迅雷下载
  8. thinkphp5 框架内分页带参数的解决办法
  9. 计算机编程form什么意思,FORM
  10. openwrt学习笔记(1)--什么是openwrt,openwrt sdk