Java 流收集器 ( Stream Collectors ) ( 二 ) - 映射和连接

yufei       6 年, 3 月 前       2045

如何使用 Java 流收集器 ( Stream Collectors ) ( 一 ) 我们对雇员数据做的都是一些统计计算,其实 java.util.stream.Collectors 还提供了一类方法用于 mapjoin

映射 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}
目前尚无回复
简单教程 = 简单教程,简单编程
简单教程 是一个关于技术和学习的地方
现在注册
已注册用户请 登入
关于   |   FAQ   |   我们的愿景   |   广告投放   |  博客

  简单教程,简单编程 - IT 入门首选站

Copyright © 2013-2022 简单教程 twle.cn All Rights Reserved.