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 返回。
评论