写点什么

Java Stream 中 map、flatMap 的使用区别

作者:zarmnosaj
  • 2022-10-26
    四川
  • 本文字数:1155 字

    阅读完需:约 4 分钟

map

map 是对 stream 流中的每个数据进行操作,一般用于类型转换、或者是结果映射,例如一个学生信息数据流,如果要获取所有学生的 name 属性,可以使用 map 操作,代码示例:


学生信息:


public class Student{    private String name;    private Long id;    private String address;    ......}
复制代码


如果是 stream 出现之前,要获取所有学生的 name,需要循环处理:


public class Demo{    public static void main(String[] args) {        Student student1 = new Student("xiaoming",1,"beijing");        Student student2 = new Student("xiaohong",2,"shandong");        ...        List<Student> studentList = Lists.asList(student1,student2,...);                List<String> allStudentNameList = new ArrayList<>();        for(int i = 0;i < studentList.size(); i++){            allStudentNameList.add(studentList.get(i).getName());        }    }}
复制代码


在出现了 stream 之后,处理方式可以修改为:


public class Demo{    public static void main(String[] args) {        Student student1 = new Student("xiaoming",1,"beijing");        Student student2 = new Student("xiaohong",2,"shandong");        ...        List<Student> studentList = Lists.asList(student1,student2,...);                List<String> allStudentNameList = studentList.stream().map(Student::getName).collect(Collectors.toList());    }}
复制代码


可以看到,繁琐的循环变为了一行代码就返回了想要的结果,其中的逻辑顺序是将 List 转换为 Stream 数据流,再由 map()方法取数据流中每个数据的 name 属性,Student::getName 是简化写法,等于:o->o.getName();最后再由 Collectors 收集为 List 返回。

flatMap

flatMap 与 map 有相同也有不同,相同的是都是对 stream 数据流中的每个数据进行处理,不同的是,map 是处理每个数据转换为另一种数据类型的输出值,而 flatMap 可以处理每个数据转换为任意数量个他类型的输出值。代码示例:


public class Demo {    public static void main(String[] args) {    String[] address = {"beijing", "nanjing","shanghai",...};
List addressList = Arrays.asList(address).stream(). map(string -> string.split("")). flatMap(string -> Arrays.stream(string)) .collect(Collectors.toList()); addressList.stream().forEach(System.out::printlv); }}
复制代码


首先也是先将 List 数据转换为了 stream 数据流,然后使用了 map 将每个数据转换为了 String[]类型,此时 Stream 中的数据类型也由 String 变为了 String[],接着再由 flatMap 将多个 Stream<String[]>都合为了一个 Stream<String[]>,最后由 Collectors 收集为 List 返回。

发布于: 刚刚阅读数: 3
用户头像

zarmnosaj

关注

靡不有初,鲜克有终 2020-02-06 加入

成都后端

评论

发布
暂无评论
Java Stream中map、flatMap 的使用区别_10月月更_zarmnosaj_InfoQ写作社区