Stream方法使用
map与flatMap
map 与 flatMap 都是用于转换已有的元素为其它元素,区别点在于:
- map 必须是一对一的,即每个元素都只能转换为1个新的元素
- flatMap 可以是一对多的,即每个元素都可以转换为1个或者多个新的元素
比如:有一个字符串ID列表,现在需要将其转为User对象列表。可以使用map来实现:
/*** 演示map的用途:一对一转换*/publicvoidstringToIntMap() { List<String>ids=Arrays.asList("205", "105", "308", "469", "627","193", "111"); // 使用流操作List<User>results=ids.stream().map(id-> { Useruser=newUser(); user.setId(id); returnuser; }).collect(Collectors.toList()); System.out.println(results); }
执行之后,会发现每一个元素都被转换为对应新的元素,但是前后总元素个数是一致的:
[User{id='205'}, User{id='105'}, User{id='308'}, User{id='469'}, User{id='627'}, User{id='193'}, User{id='111'}]
再比如:现有一个句子列表,需要将句子中每个单词都提取出来得到一个所有单词列表。这种情 况用map就搞不定了,需要 flatMap 上场了:
publicvoidstringToIntFlatmap() { List<String>sentences=Arrays.asList("hello world","Jia Gou Wu Dao"); // 使用流操作List<String>results=sentences.stream() .flatMap(sentence->Arrays.stream(sentence.split(" "))) .collect(Collectors.toList()); System.out.println(results); }
执行结果如下,可以看到结果列表中元素个数是比原始列表元素个数要多的:
[hello, world, Jia, Gou, Wu, Dao]
这里需要补充一句, flatMap 操作的时候其实是先每个元素处理并返回一个新的Stream,然后 将多个Stream展开合并为了一个完整的新的Stream,如下: