获取对象集合某个字段的数据,并拼接成字符串

可通过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));
Logo

GitCode 天启AI是一款由 GitCode 团队打造的智能助手,基于先进的LLM(大语言模型)与多智能体 Agent 技术构建,致力于为用户提供高效、智能、多模态的创作与开发支持。它不仅支持自然语言对话,还具备处理文件、生成 PPT、撰写分析报告、开发 Web 应用等多项能力,真正做到“一句话,让 Al帮你完成复杂任务”。

更多推荐