当前位置:首页 > 文章列表 > 文章 > java教程 > Java StringJoiner 怎样设置空集合的默认输出

Java StringJoiner 怎样设置空集合的默认输出

来源:17golang原创 2026-10-29 04:42:41 0浏览 收藏

Java 的 StringJoiner 在还没有添加任何元素时,可以用 setEmptyValue 指定默认输出。最关键的判断点是:这个默认值只针对“从未添加过元素”的状态;一旦调用过 add,即便加入的是空字符串,连接器也不再被视为真正空。

官方地址:https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/util/StringJoiner.html

如果空集合要显示为 []、无数据 或其他占位文本,就在创建 StringJoiner 后调用 setEmptyValue。不要用 add("") 代替它,因为两者的状态语义不同。

先看 StringJoiner 的真正空状态

StringJoiner 保存的是一组待拼接元素,并由分隔符、前缀和后缀共同生成字符串。构造完成但还没有调用 add 时,它处于真正的空状态:

import java.util.StringJoiner;

public class EmptyJoinerDemo {
    public static void main(String[] args) {
        // 分隔符只负责连接元素;前缀和后缀定义整体外壳。
        StringJoiner joiner = new StringJoiner(", ", "[", "]");

        // 未调用 add 时,默认表示是 prefix + suffix。
        System.out.println(joiner.toString());
    }
}

在这个例子里,默认表示是 [],因为前缀是 [、后缀是 ]。如果使用只有分隔符的构造器,则空状态默认会表现为空字符串;这仍然是“没有元素”,而不是已经添加了一个空元素。

StringJoiner 构造参数、空状态配置和 toString 关系的静态说明图
图1:说明图展示构造参数、空状态配置与字符串表示之间的静态关系,不是运行截图。

用 setEmptyValue 设置空集合的默认文本

setEmptyValue 接收一个非空的 CharSequence,并返回当前对象,因此可以直接链式调用。它只会改变空状态下 toString 使用的文本,不会改变已经添加元素时的分隔规则。

import java.util.StringJoiner;

public class EmptyValueDemo {
    public static void main(String[] args) {
        // 为没有元素的结果设置业务占位文本。
        StringJoiner joiner = new StringJoiner(", ", "[", "]")
                .setEmptyValue("无数据");

        // 此时还没有 add,toString 返回 setEmptyValue 的内容。
        System.out.println(joiner); // 无数据

        // 添加正常元素后,恢复为前缀、元素和后缀的组合。
        joiner.add("Java").add("StringJoiner");
        System.out.println(joiner); // [Java, StringJoiner]
    }
}

这里的 无数据 是空集合的业务展示值;加入元素之后,setEmptyValue 不会继续覆盖正常拼接结果。传入 null 会触发 NullPointerException,所以默认值本身应当使用明确的非空文本。

空字符串不等于没有调用 add

最容易混淆的是 add("")。Java API 明确规定,调用过 add 后,即使元素本身是空字符串,StringJoiner 也不再处于空状态。它的显示结果可能看起来和前后缀组合相同,但内部语义已经不同。

import java.util.StringJoiner;

public class EmptyElementDemo {
    public static void main(String[] args) {
        // 先配置空集合的业务占位值。
        StringJoiner joiner = new StringJoiner(", ", "[", "]")
                .setEmptyValue("无数据");
        System.out.println(joiner); // 无数据

        // 空字符串仍然是一次 add;它不是“没有元素”。
        joiner.add("");
        System.out.println(joiner); // []

        // 后续元素仍按正常分隔规则追加。
        joiner.add("Java");
        System.out.println(joiner); // [, Java]
    }
}

因此,如果业务规则是“列表为空时显示无数据”,应该在集合遍历结束后根据是否添加过元素决定是否调用 setEmptyValue,而不是为了得到占位文本先添加一个空字符串。若业务上空字符串本身就是一项数据,就应该保留 add("") 的语义。

StringJoiner 未调用 add、空字符串、null 与 toString 结果差异的静态说明图
图2:结果示意图对比真正空状态、空字符串元素和 null 元素的静态关系,不是运行证据。

add(null) 会输出什么

StringJoiner.add 接收的是 CharSequence。当参数为 null 时,API 会把它作为文本 "null" 加入,而不是把连接器保持在空状态:

import java.util.StringJoiner;

public class NullElementDemo {
    public static void main(String[] args) {
        // null 元素会被转换成字面文本 null。
        StringJoiner joiner = new StringJoiner("|", "");
        joiner.add(null);

        // 这里已经有一个元素,输出包含字面量 null。
        System.out.println(joiner); // 
    }
}

所以“空集合默认输出”和“数据中存在 null”是两个问题:前者用 setEmptyValue 表达,后者要在调用 add 前由业务代码决定是否过滤、替换或保留。

写测试时检查这四个边界

可以把下面四种情况作为最小回归清单,避免只断言最终字符串而忽略状态差异:

场景调用状态典型结果判断重点
未添加元素只构造并设置默认值无数据使用 emptyValue
未添加元素且未设置默认值使用前后缀构造器[]使用 prefix + suffix
添加空字符串调用 add("")[]已经不是空状态
添加 null调用 add(null)[null]null 作为字面文本加入

如果测试只比较第一行和第三行的字符串,可能会误以为两者完全相同;更稳妥的做法是同时测试后续再添加一个正常元素的结果,确认空字符串是否被当作真实元素保留。

结论:默认值负责展示,add 负责改变状态

给空集合设置展示文本时,直接使用 setEmptyValue;需要表达真实元素时才调用 add。记住三个边界:未调用 add 才会使用 emptyValue,add("") 会结束空状态,add(null) 会加入文本 null。这样在格式化列表、生成查询条件或输出配置片段时,默认占位和实际数据就不会混在一起。

相关问题

  • StringJoiner 的空值默认输出能设置为 null 吗?不能,setEmptyValue(null) 会抛出 NullPointerException;需要先决定一个具体文本。
  • 调用 setEmptyValue 后还能继续 add 吗?可以。它只影响尚未添加元素时的表示,加入元素后仍按分隔符、前缀和后缀生成结果。
  • 为什么 add 空字符串后不再使用无数据?因为空字符串也是一次成功的 add,连接器的状态已经从未添加元素变为已添加元素。
版本声明
本文转载于:17golang原创 如有侵犯,请联系study_golang@163.com删除
Java Files.probeContentType 怎样判断文件的 MIME 类型Java Files.probeContentType 怎样判断文件的 MIME 类型
上一篇
Java Files.probeContentType 怎样判断文件的 MIME 类型
Java PushbackReader 怎样回退多读的一个字符
下一篇
Java PushbackReader 怎样回退多读的一个字符
查看更多
最新文章
查看更多
课程推荐
  • 前端进阶之JavaScript设计模式
    前端进阶之JavaScript设计模式
    设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
    543次学习
  • GO语言核心编程课程
    GO语言核心编程课程
    本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
    516次学习
  • 简单聊聊mysql8与网络通信
    简单聊聊mysql8与网络通信
    如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
    500次学习
  • JavaScript正则表达式基础与实战
    JavaScript正则表达式基础与实战
    在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
    487次学习
  • 从零制作响应式网站—Grid布局
    从零制作响应式网站—Grid布局
    本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
    485次学习
查看更多
AI推荐
  • PubMedQA数据集详解:生物医学问答基准、功能与应用指南
    PubMedQA
    深入了解PubMedQA生物医学问答数据集,涵盖其核心功能、使用方法及在临床决策、药物研发等场景的应用,助力提升NLP模型性能。
    765次使用
  • H2O EvalGPT:开源LLM大模型评估与排行榜工具
    H2O EvalGPT
    H2O EvalGPT是H2O.ai推出的开源LLM评估平台,提供详细的大模型性能排行榜、行业特定基准测试及A/B测试功能,助您快速选择最适合项目的高性能大语言模型。
    762次使用
  • LMArena是什么?伯克利AI模型评估平台使用指南与功能解析
    LMArena
    LMArena是加州大学伯克利分校推出的AI模型匿名评测平台。通过盲测投票机制,用户可对比不同大模型回答并生成实时排行榜,助力开发者优化模型及用户选择最佳AI工具。
    844次使用
  • 斯坦福HELM:大语言模型Holistic Evaluation整体评估框架详解
    HELM
    深入了解斯坦福推出的HELM(Holistic Evaluation of Language Models)大模型评测体系。本文解析其核心功能、安装配置步骤及应用场景,涵盖准确性、公平性、鲁棒性等多维度指标,助力开发者全面优化语言模型性能。
    814次使用
  • MMBench详解:多模态大模型基准测试、功能特点与使用指南
    MMBench
    MMBench是由上海人工智能实验室等机构联合推出的多模态基准测试平台,提供细粒度能力评估、大规模数据集及VLMEvalKit工具。本文详细介绍其核心功能、安装使用方法及应用场景,助力开发者全面评估多模态模型性能。
    641次使用
微信登录更方便
  • 密码登录
  • 注册账号
登录即同意 用户协议 和 隐私政策
返回登录
  • 重置密码