跳转到主内容
极星编程网:以代码为星,赴技术山海!

如何在 Java 中利用 StringJoiner 设置空结果时的占位符以及自定义的起止符号

StringJoiner构造时必须指定分隔符,前缀、后缀和空值占位符需在创建时通过三参数构造函数或setEmptyValue()显式设置,且不可后续修改;空值逻辑仅在从未调用add()时生效。 StringJoiner 构造时必须指定分隔符,起止符号需额外设置 Java 的
StringJoiner
默认不支持“空集合时返回占位符”或“自动添加前缀/后缀”,它只负责拼接。起止符号(prefix/suffix)和空值占位符(emptyValue)是 1.8 新增的两个独立构造参数,**必须在创建实例时传入,后续无法修改**。 常见错误是先用
new StringJoiner(",")
创建,再试图调用方法加前后缀——这会失败,因为没有对应 setter 方法。 正确做法:用三参数构造函数
new StringJoiner(delimiter, prefix, suffix)
占位符必须显式调用
setEmptyValue(String)
,且只能调用一次;重复调用会覆盖前值 如果未调用
setEmptyValue
,空
StringJoiner
的
toString()
返回的是 prefix + suffix(例如
"[]"
),不是空字符串 空结果占位符只在没有任何 add() 调用时生效
setEmptyValue
的效果非常严格:仅当
StringJoiner
自创建以来 **从未调用过
add()
** 时,
toString()
才返回该占位符。哪怕加了一个空字符串
add("")
,它也会进入拼接流程,不再触发空值逻辑。 场景示例:拼接用户选中的标签列表,若一个都没选,想显示
""
—— 这时必须确保零次
add()
错误写法:
joiner.add(null)
或
joiner.add("")
后再检查 size,已破坏空状态 安全做法:用布尔标记是否添加过,或用
joiner.length() == 0
判断(但注意 length 包含 prefix/suffix,所以更可靠的是记录 add 次数) 起止符号与分隔符共同影响最终字符串结构 prefix 和 suffix 是字面量包裹,不参与分隔逻辑。例如
new StringJoiner(",", "[", "]").setEmptyValue("[]")
: 立即学习 “ Java免费学习笔记(深入) ”; Eclipse导入Android或其他的JAVA项目的正确方法 WORD版 本文档主要讲述的是Eclipse导入Android或其他的JAVA项目的正确方法;希望本文档会给有需要的朋友带来帮助;感兴趣的朋友可以过来看看 下载 空时 →
"[]"
(由
setEmptyValue
决定) 加一个元素
"a"
→
"[a]"
(prefix + 元素 + suffix) 加两个元素
"a"
,
"b"
→
"[a,b]"
(prefix + 元素1 + 分隔符 + 元素2 + suffix) 注意:suffix 不会因多次
add()
而重复出现,它只在末尾加一次;分隔符也只出现在元素之间,不会在开头或结尾多出一个。 替代方案:Apache Commons Lang 的 StringUtils.join 更灵活 如果业务中频繁需要“空集合返回默认值”,原生
StringJoiner
就显得笨重。比如处理
List
,得先判空再决定是否 new Joiner;而
StringUtils.join(list, ",")
默认返回空字符串,配合
ObjectUtils.defaultIfNull
或三元表达式更直白:
String result = CollectionUtils.isEmpty(tags) ? "<无标签>" : String.join(", ", tags);
或者直接用
String.join
(静态方法,本质也是基于
StringJoiner
)+ 三元判断,比手动管理
StringJoiner
实例更轻量。真正需要
StringJoiner
的场景,通常是流式构建、中间可复用、或需精确控制 prefix/suffix 且确定非空的情况。 容易忽略的一点:
StringJoiner
的
merge()
方法能合并两个 joiner,但前提是它们的 delimiter/prefix/suffix 完全一致,否则抛
IllegalArgumentException
—— 这个约束在组合多个数据源时可能意外触发。

相关文章