因为Stream主要用于对集合数据的处理场景,所以除了上面几种获取简单结果的终止方法之外, 更多的场景是获取一个集合类的结果对象,比如List、Set或者HashMap等。
这里就需要 collect 方法出场了,它可以支持生成如下类型的结果数据:
- 一个 集合类 ,比如List、Set或者HashMap等
- StringBuilder对象,支持将多个 字符串进行拼接 处理并输出拼接后结果
- 一个可以记录个数或者计算总和的对象( 数据批量运算统计 )
生成集合
应该算是collect最常被使用到的一个场景了:
publicvoidtestCollectStopOptions() { List<Dept>ids=Arrays.asList(newDept(17), newDept(22), newDept(23)); // collect成listList<Dept>collectList=ids.stream().filter(dept->dept.getId() >20) .collect(Collectors.toList()); System.out.println("collectList:"+collectList); // collect成SetSet<Dept>collectSet=ids.stream().filter(dept->dept.getId() >20) .collect(Collectors.toSet()); System.out.println("collectSet:"+collectSet); // collect成HashMap,key为id,value为Dept对象Map<Integer, Dept>collectMap=ids.stream().filter(dept->dept.getId() >20) .collect(Collectors.toMap(Dept::getId, dept->dept)); System.out.println("collectMap:"+collectMap); }
结果如下:
collectList:[Dept{id=22}, Dept{id=23}] collectSet:[Dept{id=23}, Dept{id=22}] collectMap:{22=Dept{id=22}, 23=Dept{id=23}}
生成拼接字符串
将一个List或者数组中的值拼接到一个字符串里并以逗号分隔开,这个场景相信大家都不陌生 吧?
如果通过 for 循环和 StringBuilder 去循环拼接,还得考虑下最后一个逗号如何处理的问题, 很繁琐:
publicvoidtestForJoinStrings() { List<String>ids=Arrays.asList("205", "10", "308", "49", "627", "193", "111", "193"); StringBuilderbuilder=newStringBuilder(); for (Stringid : ids) { builder.append(id).append(','); } // 去掉末尾多拼接的逗号builder.deleteCharAt(builder.length() -1); System.out.println("拼接后:"+builder.toString()); }
但是现在有了Stream,使用 collect 可以轻而易举的实现:
publicvoidtestCollectJoinStrings() { List<String>ids=Arrays.asList("205", "10", "308", "49", "627", "193", "111", "193"); StringjoinResult=ids.stream().collect(Collectors.joining(",")); System.out.println("拼接后:"+joinResult); }
两种方式都可以得到完全相同的结果,但Stream的方式更优雅:
拼接后:205,10,308,49,627,193,111,193