当前位置: 首页 > news >正文

对象集合里的id用逗号拼装几种方式

在 Java 中,将 List<BIZRoleDetail> 集合中每个对象的 role_id(假设为 Integer 类型)用英文逗号拼接成字符串,且需考虑集合为 null 或空的情况,主要有以下几种实现方法:

方法 1:传统 for 循环(兼容所有 Java 版本)

通过 for 循环遍历集合,使用 StringBuilder 拼接,手动处理 null 和空集合。

import java.util.List;public class Test {public String joinRoleIds(List<BIZRoleDetail> bizRoleDetails) {// 处理集合为 null 的情况,直接返回空字符串if (bizRoleDetails == null || bizRoleDetails.isEmpty()) {return "";}StringBuilder sb = new StringBuilder();for (int i = 0; i < bizRoleDetails.size(); i++) {BIZRoleDetail role = bizRoleDetails.get(i);Integer roleId = role.getRole_id(); // 获取 Integer 类型的 role_id// 过滤 role_id 为 null 的情况if (roleId == null) {continue;}// 拼接 role_id(转换为 String)sb.append(roleId);// 最后一个元素后不添加逗号if (i != bizRoleDetails.size() - 1) {sb.append(",");}}return sb.toString();}
}

方法 2:增强 for 循环(foreach)

简化循环逻辑,通过判断 StringBuilder 长度决定是否添加逗号,避免最后多一个逗号。

import java.util.List;public class Test {public String joinRoleIds(List<BIZRoleDetail> bizRoleDetails) {// 处理集合为 null 的情况if (bizRoleDetails == null) {return "";}StringBuilder sb = new StringBuilder();for (BIZRoleDetail role : bizRoleDetails) {Integer roleId = role.getRole_id();if (roleId == null) {continue; // 过滤 null}// 若已有内容,先加逗号(避免开头多逗号)if (sb.length() > 0) {sb.append(",");}sb.append(roleId); // 自动转换为 String}return sb.toString();}
}

方法 3:Java 8+ Stream 流(简洁版)

利用 Stream 流的 map 转换类型、filter 过滤 null,结合 Collectors.joining 拼接,通过 Optional 处理集合为 null 的情况。

import java.util.List;
import java.util.Objects;
import java.util.Optional;
import java.util.stream.Collectors;public class Test {public String joinRoleIds(List<BIZRoleDetail> bizRoleDetails) {// 处理集合为 null:用 Optional 包装,为空则返回空集合return Optional.ofNullable(bizRoleDetails).orElseGet(List::of) // 若为 null,替换为 emptyList(Java 8 用 Collections.emptyList()).stream().map(role -> role.getRole_id()) // 提取 Integer 类型的 role_id.filter(Objects::nonNull) // 过滤 null 的 role_id.map(String::valueOf) // 转换为 String 类型(适配 joining).collect(Collectors.joining(",")); // 用逗号拼接}
}

方法 4:Java 8+ Stream 流(分步处理,可读性更高)

将 Stream 操作拆分,更清晰地展示每一步逻辑。

import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;public class Test {public String joinRoleIds(List<BIZRoleDetail> bizRoleDetails) {// 集合为 null 时直接返回空字符串if (bizRoleDetails == null) {return "";}// 非 null 集合处理:过滤 -> 转换类型 -> 拼接return bizRoleDetails.stream().map(BIZRoleDetail::getRole_id) // 提取 role_id.filter(Objects::nonNull) // 过滤 null.map(String::valueOf) // 转为 String.collect(Collectors.joining(","));}
}

方法 5:使用 Guava 工具类(需引入第三方库)

若项目依赖 Google Guava,可利用 Joiner 工具类简化拼接逻辑(需处理 null 集合和 null 元素)。

<!-- Maven 依赖 -->
<dependency><groupId>com.google.guava</groupId><artifactId>guava</artifactId><version>32.1.3-jre</version>
</dependency>
import com.google.common.base.Joiner;
import com.google.common.collect.Lists;
import java.util.List;
import java.util.stream.Collectors;public class Test {public String joinRoleIds(List<BIZRoleDetail> bizRoleDetails) {// 处理集合为 null:替换为 emptyListList<BIZRoleDetail> safeList = Objects.isNull(bizRoleDetails) ? Lists.newArrayList() : bizRoleDetails;// 提取非 null 的 role_id 并转换为 StringList<String> roleIdStrs = safeList.stream().map(role -> role.getRole_id()).filter(Objects::nonNull).map(String::valueOf).collect(Collectors.toList());// 用 Guava Joiner 拼接return Joiner.on(",").join(roleIdStrs);}
}

总结

方法

特点

适用场景

传统 for 循环

兼容所有 Java 版本,逻辑直观

低版本 Java(<8)项目

增强 for 循环

代码更简洁,避免索引操作

所有 Java 版本,偏好简洁循环

Stream 流(简洁版)

一行代码完成,Java 8+ 推荐

高版本 Java 项目,追求代码简洁

Stream 流(分步版)

逻辑拆分,可读性高

高版本 Java 项目,注重代码可维护性

Guava 工具类

依赖第三方库,简化拼接

已引入 Guava 的项目

所有方法均能处理:

  • 集合为 null → 返回空字符串 ""
  • 集合为空(size=0)→ 返回空字符串 ""
  • role_idnull → 自动过滤,不参与拼接
  • 正常情况 → 拼接为 id1,id2,id3 格式字符串
http://www.dtcms.com/a/469530.html

相关文章:

  • 框架--MybatisPlus
  • Coze源码分析-资源库-编辑数据库-前端源码-核心逻辑与接口
  • TikTok SDE OA 2025 真题解析与秋招趋势
  • idea 中 mapper.xml黄线警告怎么去掉
  • NXP - MDK460的调试设置
  • 15.UE-游戏逆向-DumpUE struct
  • 百度统计api兰州企业网站排名优化
  • 网站右下角悬浮窗口js代码 兼容各浏览器页面置换算法课程设计
  • NeurIPS 2025 | 华中科大小米等提出语义提示扩散Transformer,实现精准深度估计新范式!
  • Ansible-playbook剧本
  • Mata Summon - Transform text prompts or photos into dynamic.
  • Arbess从入门到实战(11) - 使用Arbess+GitLab实现C++项目自动化部署
  • 做视频网站版权怎么解决企业建站费用情况
  • AICC2025 智算中心与算力服务论坛顺利举办
  • 卷积神经网络CNN(五): 标准CNN神经网络
  • Python 实现 Excel 文件加密与保护
  • 如何查找网站死链网站建设服务费属于
  • 容器编排大王Kubernetes——介绍与部署(1)
  • Python3 中级练习:简易库存管理系统
  • Centos 7/8 安装 Redis
  • 高通平台蓝牙学习--揭秘 WCN Split A2DP(终章)
  • 工业设计网站哪家好包头建设工程安全监督站网站
  • 云原生-k8s
  • 大型手游可以在云手机中流畅运行吗
  • 移动端云手机的优势都有哪些?
  • clk_divide时钟分频模块
  • 手机群控软件如何优化游戏运营的运营策略
  • 目前流行的网站开发设计品牌网站建设意义
  • 使用Mybatis-Plus,以及sqlite的使用
  • 一元一次方程的解