声明:本文使用JDK1.8
Java8提供了丰富的lambda的API。今天我们来讲讲关于其中的stream(流的操作)。对于List集合,有了stream的流操作,感觉如虎添翼。
生成一个List
1 | String str = "1,2,3,4,10,11,9,66,222,12"; |
上面的代码Stream.of 为我们生成了一个List
下面来简单的介绍下stream。
map
map:对于Stream中包含的元素使用给定的转换函数进行转换操作,新生成的Stream只包含转换生成的元素
map方法是对列表里面的对象的转换,比如上面的map的功能是吧String转换成Integer。除了这样的转换,你也可以对对象进行你需要的操作。比如现在有一个对象ListDTO:
1 |
|
现在这么一个List
1 | List<Integer> idList = beans.stream().map(ListDTO::getId).collect(Collectors.toList()); |
如果你想要得到name的列表,也可以进行上面类似的操作。下面对List列表的元素先转换成大写,在用逗号把元素拼接起来。
1 | // 将字符串换成大写并用逗号拼接起来 |
输出:
1 | USA, JAPAN, FRANCE, GERMANY, ITALY, U.K., CANADA |
flatMap
类似于map,但是flatMap是对Stream之间的转换。
1 | String[][] data = new String[][]{{"a", "b"}, {"c", "d"}, {"e", "f"}}; |
count
count()是对列表的聚合,统计列表的数量。
1 | Long count = list.stream().count(); |
filter
对于Stream中包含的元素使用给定的过滤函数进行过滤操作,新生成的Stream只包含符合条件的元素
distinct
distinct是对stream里面的元素进行去重,有点类似于SQL里面的distinct去重
limit
对一个Stream进行截断操作,获取其前N个元素,如果原Stream中包含的元素个数小于N,那就获取其所有的元素
stream 生成 map
上面我们介绍了stream里面的toList(),下面我们来介绍下如何使用stream直接生成map,而不是像以前一样,需要循环后再一个一个的put进map。虽然我们也可以第三方的jar生成Map,比如Google的某些jar,使用里面的Maps.uniqueIndex()也可以直接把List转换成Map。
toMap
利用Collectors里面的toMap对List列表转换Map。
1 | // 这种toMap,当出现Key相同时,会出现 Duplicate key 问题 |
前者的toMap使用的是 throwingMerger,在出现key相同时,抛出异常;后者的toMap使用的是mergeFunction,如示例中,如果出现key相同的元素,新的key能覆盖旧的。
groupingBy
利用Collectors里面的groupingBy,可以对列表进行分组,总和和排序。
1 | public static void main(String[] args) { |
总和
1 | List<String> items = Arrays.asList("Apple", "Apple", "orange", |
输出结果:
1 | {papaya=1, banana=1, orange=2, Apple=3} |
排序
1 | Map<String, Long> finalMap = new LinkedHashMap<>(); |
分组
现在有数据
1 | public static List<ListDTO> getBeanDataList(){ |
下面更加其中的ID作为Map的key,对上面的List进行Map.
1 | Map<Integer,List<ListDTO>> listMap = beans.stream().collect( |
把对象中的name取出并塞到一个Set中
1 | Map<Integer,Set<String>> setMap = beans.stream().collect( |
其他
现在需要对上面的集合,根据ID,对数据进行统计。
1 | Map<Integer,Long> countMap = beans |
Stream 和 parallelStream
Stream
是普通的对流操作,而 parallelStream
是对集合进行并发操作,看下面的对两者的简单比较:
1 | public static void main(String[] args) { |
结果:
1 | stream 耗时:77ms |
从最终的耗时可以看出,对于 parallelStream
处理大量数据的时候,效率还是有很大的提升的。