收集器简介

  • 将流中的元素累积成一个结果
  • 作用域终端操作collect()上
  • collect/Collector/Collectors
    • collect:作为终端操作出现的,流收集的最后一个步骤,一个方法
    • Collector:是一个接口,collect方法需要接收一个实现了Collector接口的收集器才可以收集
    • Collectors:是一个工具类,已经提前封装预制了一些实现了Collector接口的收集器,可以直接哪来用

常用预定义收集器功能

  • 将流元素归约和汇总一个值
  • 将流元素分组
  • 将流元素分区

实战:预定义收集器案例

集合收集器

将流元素归约和汇总为一个值

1
2
3
4
5
6
7
8
9
10
11
/**
* 集合收集器
*/
@Test
public void toList() {
List<Sku> skus = CartService.getCartSKuList();
List<Sku> skuList = skus.stream()
.filter(sku -> sku.getTotalPrice() > 1000)
.collect(Collectors.toList());
System.out.println(JSONUtil.parse(skuList));
}

执行后,输出的结果

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
[{
"totalPrice": 4999,
"skuPrice": 4999,
"skuCategory": "ELECTRONICS",
"skuName": "无人机",
"totalNum": 1,
"skuId": 654032
}, {
"totalPrice": 2299,
"skuPrice": 2299,
"skuCategory": "ELECTRONICS",
"skuName": "VR一体机",
"totalNum": 1,
"skuId": 654033
}, {
"totalPrice": 3999,
"skuPrice": 3999,
"skuCategory": "SPORTS",
"skuName": "跑步机",
"totalNum": 1,
"skuId": 654221
}, {
"totalPrice": 1999,
"skuPrice": 1999,
"skuCategory": "CLOTHING",
"skuName": "牛仔裤",
"totalNum": 1,
"skuId": 654022
}]

分组

将流元素分组

1
2
3
4
5
6
7
8
9
10
11
/**
* 分组
*/
@Test
public void group() {
List<Sku> skus = CartService.getCartSKuList();
// Map<分组条件, 结果集合>
Map<Enum<SkuCategoryEnum>, List<Sku>> collect = skus.stream()
.collect(Collectors.groupingBy(sku -> sku.getSkuCategory()));
System.out.println(JSONUtil.parse(collect));
}

执行后,输出的结果

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
{
"BOOKS": [{
"totalPrice": 79.8,
"skuPrice": 79.8,
"skuCategory": "BOOKS",
"skuName": "Java编程思想",
"totalNum": 1,
"skuId": 654121
}, {
"totalPrice": 149.8,
"skuPrice": 149.8,
"skuCategory": "BOOKS",
"skuName": "Java核心技术",
"totalNum": 1,
"skuId": 654122
}],
"CLOTHING": [{
"totalPrice": 299,
"skuPrice": 299,
"skuCategory": "CLOTHING",
"skuName": "睡衣套装",
"totalNum": 1,
"skuId": 654021
}, {
"totalPrice": 1999,
"skuPrice": 1999,
"skuCategory": "CLOTHING",
"skuName": "牛仔裤",
"totalNum": 1,
"skuId": 654022
}],
"SPORTS": [{
"totalPrice": 3999,
"skuPrice": 3999,
"skuCategory": "SPORTS",
"skuName": "跑步机",
"totalNum": 1,
"skuId": 654221
}],
"ELECTRONICS": [{
"totalPrice": 4999,
"skuPrice": 4999,
"skuCategory": "ELECTRONICS",
"skuName": "无人机",
"totalNum": 1,
"skuId": 654032
}, {
"totalPrice": 2299,
"skuPrice": 2299,
"skuCategory": "ELECTRONICS",
"skuName": "VR一体机",
"totalNum": 1,
"skuId": 654033
}]
}

分区

将流元素分区

1
2
3
4
5
6
7
8
9
10
/**
* 分区(分组的一个特例)
*/
@Test
public void partition() {
List<Sku> skus = CartService.getCartSKuList();
Map<Boolean, List<Sku>> collect = skus.stream()
.collect(Collectors.partitioningBy(sku -> sku.getTotalPrice() > 1000));
System.out.println(JSONUtil.parse(collect));
}

执行后,输出的结果

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
{
"false": [{
"totalPrice": 79.8,
"skuPrice": 79.8,
"skuCategory": "BOOKS",
"skuName": "Java编程思想",
"totalNum": 1,
"skuId": 654121
}, {
"totalPrice": 149.8,
"skuPrice": 149.8,
"skuCategory": "BOOKS",
"skuName": "Java核心技术",
"totalNum": 1,
"skuId": 654122
}, {
"totalPrice": 299,
"skuPrice": 299,
"skuCategory": "CLOTHING",
"skuName": "睡衣套装",
"totalNum": 1,
"skuId": 654021
}],
"true": [{
"totalPrice": 4999,
"skuPrice": 4999,
"skuCategory": "ELECTRONICS",
"skuName": "无人机",
"totalNum": 1,
"skuId": 654032
}, {
"totalPrice": 2299,
"skuPrice": 2299,
"skuCategory": "ELECTRONICS",
"skuName": "VR一体机",
"totalNum": 1,
"skuId": 654033
}, {
"totalPrice": 3999,
"skuPrice": 3999,
"skuCategory": "SPORTS",
"skuName": "跑步机",
"totalNum": 1,
"skuId": 654221
}, {
"totalPrice": 1999,
"skuPrice": 1999,
"skuCategory": "CLOTHING",
"skuName": "牛仔裤",
"totalNum": 1,
"skuId": 654022
}]
}