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