先定义好后面做示例要用的数据:
List listUser = new ArrayList<>();
listUser.add(new User("李白", 20, true));
listUser.add(new User("杜甫", 40, true));
listUser.add(new User("李清照", 18, false));
listUser.add(new User("李商隐", 23, true));
listUser.add(new User("杜牧", 39, true));
listUser.add(new User("苏小妹", 16, false));
这个User就是一个普通的Bean对象,有name(姓名)、age(年龄)、gender(性别)三个属性及对应的set/get方法。
从 joining 方法的定义可以看到,这里重载了3个 joining 方法:无参数,1个参数,3个参数。然后从参数命名上看delimiter-分隔符、prefix-前缀、suffix-后缀大约可以猜出参数的作用了,然后再看注释的参数说明
Returns a {@code Collector} that concatenates the input elements,separated by the specified delimiter, with the specified prefix and suffix, in encounter order.
果然如是,下面是举例说明。
将指定的值join成字符串
String join1 = listUser.stream().map(User::getName).collect(Collectors.joining());
System.out.println("join后的结果:" + join1); // 输出==》 李白杜甫李清照李商隐杜牧苏小妹
将List中的用户名join成中间用","分隔的字符串
String join2 = listUser.stream().map(User::getName).collect(Collectors.joining(","));
System.out.println("join后的结果:" + join2); // 输出==》李白,杜甫,李清照,李商隐,杜牧,苏小妹
将List中的用户名join成以前缀是"{",后缀是"}",中间用","分隔的字符串
String join3 = listUser.stream().map(User::getName).collect(Collectors.joining(",", "{", "}"));
System.out.println("join后的结果:" + join3); // 输出==》{李白,杜甫,李清照,李商隐,杜牧,苏小妹}
mapping方法的定义如图
方法有2个参数,Function类型的mapper和Collector类型的downstream。通过注释可以看到方法是通过参数mapper函数来处理List中的每一个数据,然后用downstream来将处理后的数据收集起来。举例说明:
取出List中所有人的姓名放到一个新的List中去
// 定义一个入参为User,返回String的函数
Function mapper=(user)->{
return user.getName();
};
List userNames = listUser.stream().collect(Collectors.mapping(mapper, Collectors.toList()));
以上代码再简写一下:
List userNames = listUser.stream().collect(Collectors.mapping((user)->{return user.getName();}, Collectors.toList()));
也可以写成这样:
List userNames = listUser.stream().collect(Collectors.mapping(User::getName, Collectors.toList()));