简单来说map 是对每一个元素单独处理后单独存放,flatMap 是把每个元素转换成流之后合并成一个流然后这个被合并的流可以再被处理
比如如果你想要把一个类中的tags去重并筛选中不是"技术"的标签你就可以使用flatMap
public static void main(String[] args) throws Exception { class User { private String name; private List<String> tags; public User(String name, List<String> tags) { this.name = name; this.tags = tags; } public List<String> getTags() { return tags; } } List<User> users = Arrays.asList( new User("张三", Arrays.asList("技术", "音乐")), new User("李四", Arrays.asList("旅行", "技术")), new User("王五", Arrays.asList("美食", "旅行")) ); List<String> allTags = users.stream() .flatMap(user -> user.getTags().stream()) // 流合并 .filter(s->!s.contains("技术")) //判断 .distinct()// 去重 .collect(Collectors.toList()); System.out.println(allTags); }
这样可以一步到位,避免了,先提取,然后去重,然后判断。
这里的user.getTags().stream()如果使用的是map()那么会报错,因为map是直接处理完之后送入集合,现在user.getTags().stream()并不是一个String类型的所以会报错。
flatMap是利用user.getTags().stream()把所有的元素处理并总和成一个流,然后使用
.filter(s->!s.contains("技术")) //判断 .distinct()// 去重
去处理之后再送入集合中去