Java8 - 对流(数据)进行自定义分块:partitioningBy收集器

partitioningBy收集器

在JDK8中,可以对流进行方便的自定义分块,通常是根据某种过滤条件将流一分为二。

例如:有一组人名,包含中文和英文,在 JDK8 中可以通过 partitioningBy 收集器将其区分开来。

下面是代码例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
// 创建一个包含人名称的流(英文名和中文名)
Stream<String> stream = Stream.of("Alen", "Hebe", "Zebe", "张成瑶", "钟其林");
// 通过判断人名称的首字母是否为英文字母,将其分为两个不同流
final Map<Boolean, List<String>> map = stream.collect(Collectors.partitioningBy(s -> {
// 如果是英文字母,则将其划分到英文人名,否则划分到中文人名
int code = s.codePointAt(0);
return (code >= 65 && code <= 90) || (code >= 97 && code <= 122);
}));
// 输出分组结果
map.forEach((isEnglishName, names) -> {
if (isEnglishName) {
System.out.println("英文名称如下:");
} else {
System.out.println("中文名称如下:");
}
names.forEach(name -> System.out.println("\t" + name));
});

程序输出结果如下:

1
2
3
4
5
6
7
中文名称如下:
张成瑶
钟其林
英文名称如下:
Alen
Hebe
Zebe