获取对象集合某个字段的数据,并拼接成字符串
可通过list.stream().map(类名::某字段的get方法).collect(Collectors.joining(“指定分割符”))来实现,如
public class TestListStream {
public static void main(String[] args) {
List<Stu> list = new ArrayList<Stu>();
list.add(new Stu("person1", "111111111", 12, false));
list.add(new Stu("person2", null, 12, false));
list.add(new Stu("person3", "222222222", 16, false));
list.add(new Stu("person4", "333333333", 14, true));
list.add(new Stu("person5", "444444444", 13, true));
list.add(new Stu("person6", "555555555", 12, true));
String str = list.stream().map(Stu::getPhone).collect(Collectors.joining(","));
System.out.println(str);
}
}
class Stu{
String name;
String phone;
int age;
boolean flag;
public Stu(String name, String phone, int age, boolean flag) {
this.name = name;
this.phone = phone;
this.age = age;
this.flag = flag;
}
}
但是如果某个对象的目标字段为空,则会拼接一个字符串为null的数据,如下图
解决方法:可以在获取目标字段前加个判断,这里直接使用stream()的filter方法(判空方法很多,这里随便简单写一个)
String str = list.stream()
.filter(stu -> stu.getPhone() != null)
.map(Stu::getPhone).collect(Collectors.joining(","));
再次执行,问题解决
Collections.stream()的功能远不止这些,其他还有例如:循环遍历forEach、去重distinct、限制个数limit以及获取符合条件的第一个元素findFirst等等,也可以获取对象某个属性转成List<T>集合,例如想获取上面Stu对象的phone字段转成List<String>集合,可通过以下方法获取:
List<String> phones = list.stream().map(stu-> stu.getPhone()).collect(Collectors.toList());
还有以对象某个字段作为key,转成Map<T, List<T>>(也就是分组),例如获取上面Stu的age字段当成key,统计所有相同age的List<Stu>可通过以下方式获取:
Map<Integer, List<Stu>> stuMaps = list.stream().collect(Collectors.groupingBy(Stu::getAge));