在 如何使用 Java 流收集器 ( Stream Collectors ) ( 一 ) 我们对雇员数据做的都是一些统计计算,其实 java.util.stream.Collectors
还提供了一类方法用于 map
和 join
映射 mapping()
比如我们可以把收集到的数据传递给 Collectors.mapping()
方法进行映射处理,以获取一些特定的信息
mapping()
方法接收两个参数,第一个参数为如何处理每一条数据,第二个参数为当 mapping
完成后如何处理数据
例如下面的代码,我们使用 mapping()
方法获取所有的雇员姓名,然后将数据转换为一个列表 List
List<String> employeeNames = employees.stream().collect(Collectors.mapping(Employee::getName, Collectors.toList())); System.out.println(employeeNames);
输出结果如下
[John Nhoj, South Htuos, Reet Teer, Prateema Rai, Yogen Rai]
拼接 joining()
其实我们也可以在不调用 mapping
的情况下直接调用 流 ( Stream
) 提供的 map()
方法来获取所有的雇员名字,然后传递给 joining()
方法将这些雇员名字使用特定的字符串拼接在一起,比如下面的示例
String employeeNamesStr = employees.stream().map(Employee::getName).collect(Collectors.joining(",")); System.out.println(employeeNamesStr);
输出结果如下
John Nhoj,South Htuos,Reet Teer,Prateema Rai,Yogen Rai
你应该很好奇,如果按照常规使用,该方法应该按照下面这么写才对
List<String> employeeNames2 = employees.stream().collect(Collectors.mapping(Employee::getName, Collectors.joining(","))); System.out.println(employeeNames2);
这是一个假象,会报错
MyCollectors.java:93: 错误: 需要')' List<String> employeeNames = employees.stream().collect(Collectors.mapping(Employee::getName, Collectors.joining("++")); ^ 1 个错误 lie:java luojianguo$ javac MyCollectors.java && java MyCollectors MyCollectors.java:93: 错误: 已在方法 main(String[])中定义了变量 employeeNames List<String> employeeNames = employees.stream().collect(Collectors.mapping(Employee::getName, Collectors.joining("++"))); ^ MyCollectors.java:93: 错误: 不兼容的类型: 推论变量 R#1 具有不兼容的限制范围 List<String> employeeNames = employees.stream().collect(Collectors.mapping(Employee::getName, Collectors.joining("++"))); ^ 等式约束条件: String,R#2 上限: List<String>,Object 其中, R#1,A#1,T#1,R#2,T#2,U,A#2是类型变量: R#1扩展已在方法 <R#1,A#1>collect(Collector<? super T#1,A#1,R#1>)中声明的Object A#1扩展已在方法 <R#1,A#1>collect(Collector<? super T#1,A#1,R#1>)中声明的Object T#1扩展已在接口 Stream中声明的Object R#2扩展已在方法 <T#2,U,A#2,R#2>mapping(Function<? super T#2,? extends U>,Collector<? super U,A#2,R#2>)中声明的Object T#2扩展已在方法 <T#2,U,A#2,R#2>mapping(Function<? super T#2,? extends U>,Collector<? super U,A#2,R#2>)中声明的Object U扩展已在方法 <T#2,U,A#2,R#2>mapping(Function<? super T#2,? extends U>,Collector<? super U,A#2,R#2>)中声明的Object A#2扩展已在方法 <T#2,U,A#2,R#2>mapping(Function<? super T#2,? extends U>,Collector<? super U,A#2,R#2>)中声明的Object 2 个错误
其实说白了,就是,Collectors
收集器的所有数据都必须经过 collect()
方法,不然不能产生所需要的数据类型
joinning()
方法返回结果的前缀和后缀
joinning()
方法还有一个重载版本,可以给返回的拼接的字符串添加前缀和后缀
Collector<CharSequence,?,String> joining(CharSequence delimiter, CharSequence prefix, CharSequence suffix)
因此,我们可以以特定的格式收集雇员姓名
String employeeNamesStr = employees.stream().map(Employee::getName).collect(Collectors.joining(", ", "Employees = {", "}")); System.out.println(employeeNamesStr);
输出结果如下
Employees = {John Nhoj, South Htuos, Reet Teer, Prateema Rai, Yogen Rai}
目前尚无回复