优雅拼接字符串:StringJoiner 的完整指南
在Java开发中,字符串拼接是高频操作。无论是日志格式化、构建CSV数据,还是生成动态SQL,开发者常需处理分隔符、前缀和后缀的组合。传统的StringBuilder虽然灵活,但代码冗余且易出错。Java 8推出的StringJoiner类,以简洁的链式调用和自动处理边界的能力,成为字符串拼接的优雅解决方案。本文将通过丰富的代码示例,详解StringJoiner的核心功能。
一、StringJoiner 的构造方法
StringJoiner提供了两种构造方法,适应不同场景的字符串拼接需求。
1. 仅指定分隔符
适用于无需前后缀的简单拼接。
// 语法:StringJoiner(CharSequence delimiter)
StringJoiner joiner = new StringJoiner(", ");
joiner.add("苹果").add("香蕉").add("橙子");
System.out.println(joiner.toString()); // 输出:苹果, 香蕉, 橙子
2. 指定分隔符 + 前缀 + 后缀
适合需要包裹内容的场景,如JSON数组、带括号的列表等。
// 语法:StringJoiner(CharSequence delimiter, CharSequence prefix, CharSequence suffix)
StringJoiner joiner = new StringJoiner(" | ", "[ ", " ]");
joiner.add("Java").add("Python").add("C++");
System.out.println(joiner.toString()); // 输出:[ Java | Python | C++ ]
二、StringJoiner 的关键方法
通过链式调用,StringJoiner提供高效且直观的操作方式。
1. add(CharSequence element)
添加元素,自动处理分隔符的插入位置。
StringJoiner joiner = new StringJoiner("-");
joiner.add("2023").add("08").add("20");
System.out.println(joiner.toString()); // 输出:2023-08-20
2. merge(StringJoiner other)
合并两个StringJoiner对象,保留当前对象的分隔符和前后缀。
StringJoiner joiner1 = new StringJoiner(",", "[", "]");
joiner1.add("A").add("B"); StringJoiner joiner2 = new StringJoiner("+", "<", ">");
joiner2.add("1").add("2");joiner1.merge(joiner2);
System.out.println(joiner1.toString()); // 输出:[A,B,1+2]
3. setEmptyValue(CharSequence emptyValue)
设置当无元素时的默认返回值,避免空输出。
StringJoiner joiner = new StringJoiner("/");
joiner.setEmptyValue("暂无数据");
System.out.println(joiner.toString()); // 输出:暂无数据
4. toString()
生成最终字符串,自动添加前后缀并移除末尾多余的分隔符。
StringJoiner joiner = new StringJoiner(", ", "{ ", " }");
joiner.add("Name").add("Age").add("City");
System.out.println(joiner.toString()); // 输出:{ Name, Age, City }
三、实战场景与进阶技巧
1. 与Stream API结合
将集合快速转换为格式化字符串。
List<String> list = Arrays.asList("北京", "上海", "广州");
String result = list.stream().collect(Collectors.joining(", ", "Cities: [", "]"));
System.out.println(result); // 输出:Cities: [北京, 上海, 广州]
2. 处理空值或过滤元素
灵活跳过无效数据。
List<String> data = Arrays.asList("Java", "", "Python", null);
StringJoiner joiner = new StringJoiner("; ");
data.stream().filter(str -> str != null && !str.isEmpty()).forEach(joiner::add);
System.out.println(joiner.toString()); // 输出:Java; Python
四、注意事项
- 版本兼容性:需Java 8及以上环境。
- 空值处理:默认允许添加
null,但会转换为字符串"null",建议提前过滤。 - 性能:底层依赖
StringBuilder,适用于常规数据量,超大数据建议直接操作StringBuilder。
结语
StringJoiner以极简的设计解决了字符串拼接中的常见痛点,尤其在与Stream API结合时,能大幅提升代码的简洁性和可维护性。无论是日志格式化、数据导出,还是动态查询构建,掌握StringJoiner都能让你的代码更加优雅高效。
相关文章:
优雅拼接字符串:StringJoiner 的完整指南
在Java开发中,字符串拼接是高频操作。无论是日志格式化、构建CSV数据,还是生成动态SQL,开发者常需处理分隔符、前缀和后缀的组合。传统的StringBuilder虽然灵活,但代码冗余且易出错。Java 8推出的StringJoiner类,以简洁…...
AFL++安装
学习fuzzing也几天了,今天记录AFL的安装及使用 一、实验环境 虚拟机:ubuntu20.04 当然也可以uname -a去看自己的版本号 二、AFL安装 1.先更新一下工具 sudo apt update2.安装AFL必要的一些依赖,例如编译工具(如 build-essen…...
开发者社区测试报告(功能测试+性能测试)
功能测试 测试相关用例 开发者社区功能背景 在当今数字化时代,编程已经成为一项核心技能,越来越多的人开始学习编程,以适应快速变化的科技 环境。基于这一需求,我设计开发了一个类似博客的论坛系统,专注于方便程序员…...
如何优化 VS Code 远程开发环境?高效配置与性能提升策略
相关系列文章 《新手教学系列——善用 VSCode 工作区,让开发更高效》 《新手教学系列——用 VSCode 实现高效远程开发》 《Webpack 优化全攻略:彻底解决 Vue 项目 npm run dev 的内存泄露问题》 引言 随着开发环境不断进化,VS Code 作为一款轻量级的代码编辑器,已经成为…...
【二】JavaScript能力提升---this对象
目录 this的理解 this的原理 事件绑定中的this 行内绑定 动态绑定 window定时器中的this 相信小伙伴们看完这篇文章,对于this的对象可以有一个很大的提升! this的理解 对于this指针,可以先记住以下两点: this永远指向一个…...
YC 孵化项目 Pinch:实时语音翻译视频会议平台;Mistral OCR:能处理多语言多模态复杂文档丨日报
开发者朋友们大家好: 这里是 「RTE 开发者日报」 ,每天和大家一起看新闻、聊八卦。 我们的社区编辑团队会整理分享 RTE(Real-Time Engagement) 领域内「有话题的 技术 」、「有亮点的 产品 」、「有思考的 文章 」、「有态度的 …...
OSPF报文分析
OSPF报文分析 组播地址 224.0.0.0~224.0.0.255为预留的组播地址(永久组地址),地址224.0.0.0保留不做分配,其它地址供路由协议使用; 224.0.1.0~238.255.255.255为用户可用的组播地址(…...
蓝桥杯刷题周计划(第二周)
目录 前言题目一题目代码题解分析 题目二题目代码题解分析 题目三题目代码题解分析 题目四题目代码题解分析 题目五题目代码题解分析 题目六题目代码题解分析 题目七题目代码题解分析 题目八题目题解分析 题目九题目代码题解分析 题目十题目代码题解分析 题目十一题目代码题解分…...
PH热榜 | 2025-03-09
1. ResumeUp 2.0 标语:聊聊,几分钟内就能帮助你打造完美的ATS简历。 介绍:告别为写完美简历而烦恼的日子吧!只需与人工智能聊天,回答几个简单的问题,就能在几分钟内生成强有力的简历,不仅能通…...
《gradio :AI demos》
《gradio :AI demos》 Folders and files Name Last commit message Last commit date parent directory .. agent_chatbot Declare exports in __all__ for type checking (#10238) 3 months ago all_demos Fix deployed Spaces (#10271) 2 months ago …...
Interop_UdsProtocolStack之数据解析器使用方法
一、背景与需求 在汽车电子领域,UDS(Unified Diagnostic Services)协议栈的响应报文解析是实现ECU诊断功能的核心环节。本文提出一种基于配置驱动的通用解析器开发方案,满足以下行业需求: 多协议兼容性:支…...
从0开始完成基于异步服务器的boost搜索引擎
文章目录 前言一、本项目涉及的技术栈和环境二、boost是什么?三、项目的相关背景四、项目的相关原理五、正排索引 vs 倒排索引 - 搜索引擎具体原理六、 编写数据去标签与数据清洗的模块 Parser6.1 下载boost的文档库6.2 去标签6.3 代码编写 七、索引模块7.1. 整体框…...
炒菜本质是 “能量(火候)与食材特性”的动态平衡
炒菜看似简单,但想要做到色香味俱全,需遵循一套清晰的逻辑链条。以下从底层逻辑到实操步骤拆解: 一、核心逻辑:控制变量,精准匹配 炒菜本质是 “能量(火候)与食材特性”的动态平衡,…...
AI Copilot——维新派的贾维斯,守旧派的墓志铭(程序员视角)
6500万年前的那颗陨石好像要落下来了 这一段时间,伴随着claude sonnet 3.7的发布 以及cursor,windsurf 等一众AI智能编辑器的涌现,社区的programming自媒体坐不住了,有一个观点已经快要溢出屏幕:程序员这个岗位要黄&a…...
Java Spring MVC (2)
常见的Request Controller 和 Response Controller 的区别 用餐厅点餐来理解 想象你去一家餐厅吃饭: Request Controller(接单员):负责处理你的点餐请求,记录你的口味、桌号等信息。Response Controller(…...
对开源VLA sota π0的微调——如何基于各种开源数据集、以及你自己的私有数据集微调π0(含我司的微调实践)
前言 25年2.4日,几个月前推出π0的公司Physical Intelligence (π)宣布正式开源π0及π0-FAST,如之前所介绍的,他们对用超过 10,000 小时的机器人数据进行了预训练 该GitHub代码仓库「 π0及π0-FAST的GitHub地址:github.com/Ph…...
[排序算法]直接插入排序
1.基本思想 直接插入排序是一种简单的插入排序法,其基本思想是:把待排序的记录按其关键码值的大小逐个插入到一个已经排好序的有序序列中,直到所有的记录插入完为止,得到一个新的有序序列。 实际中我们玩扑克牌时,就用…...
四、云原生应用监控-Etcd
Etcd 是 Kubernetes 内部核心组件之一,作为分布式键值存储,天然支持 Prometheus 监控,自带 /metrics 端点,可直接被 Prometheus 抓取。 Etcd监控需要使用到证书。 一、检查云原生Etcd 检查节点上的Etcd [root@k8s-master01 manifests]#netstat -lnpt |grep etcd tcp …...
STM32-I2C通信外设
目录 一:I2C外设简介 二:I2C外设数据收发 三:I2C的复用端口 四:主机发送和接收 五:硬件I2C读写MPU6050 相关函数: 1.I2C_ GenerateSTART 2.I2C_ GenerateSTOP 3.I2C_ AcknowledgeConfig 4.I2C…...
CTA策略【量化理论】
CTA策略演变史 全称:Commodity Trading Advisor (商品交易顾问) CTA最开始是指通过为客户提供期权、期货方面的交易建议,或者直接通过受管理的期货账户参与实际交易,来获得收益的机构或个人。 随着市场的发展&#…...
Cinema 4D 2026液体模拟实战:如何用新功能打造逼真水流效果(附参数设置)
Cinema 4D 2026液体模拟实战:如何用新功能打造逼真水流效果(附参数设置) 在三维动画和特效设计领域,液体模拟一直是技术难度最高、计算资源消耗最大的环节之一。Cinema 4D 2026针对这一核心功能进行了重大升级,特别是改…...
STLink调试工具与STM8/STM32连接技术详解
STLink与STM8/STM32单片机连接技术详解1. STLink调试工具概述STLink是意法半导体(STMicroelectronics)官方推出的嵌入式开发调试工具,主要用于STM8和STM32系列单片机的程序烧录和在线调试。该工具具有以下核心功能特性:支持SWD(Serial Wire Debug)和SWIM…...
Hearthstone-Script:3大核心功能带你轻松玩转炉石传说自动化![特殊字符]
Hearthstone-Script:3大核心功能带你轻松玩转炉石传说自动化!🔥 【免费下载链接】Hearthstone-Script Hearthstone script(炉石传说脚本)(2024.01.25停更至国服回归) 项目地址: https://gitco…...
芯片可靠性测试避坑指南:为什么你的FCBGA封装必须做BHast(附硬件制备全流程)
芯片可靠性测试避坑指南:为什么你的FCBGA封装必须做BHast(附硬件制备全流程) 在芯片可靠性测试领域,BHast(Highly Accelerated Temperature and Humidity Stress Test)是一个经常被讨论却又容易被误解的测试…...
颠覆式开源工具GHelper:极简华硕笔记本硬件控制解决方案
颠覆式开源工具GHelper:极简华硕笔记本硬件控制解决方案 【免费下载链接】g-helper Lightweight Armoury Crate alternative for Asus laptops. Control tool for ROG Zephyrus G14, G15, G16, M16, Flow X13, Flow X16, TUF, Strix, Scar and other models 项目地…...
Rust 看了流泪,AI 看了沉默:扒开 Go 泛型最让你抓狂的“残疾”类型推断
大家好,我是Tony Bai。在这个大模型(AI)写代码如喝水一般简单的时代,你有没有遇到过一种极其憋屈的场景:你让 Claude Code 或者 Codex 帮你写了一段 Go 语言代码,逻辑清晰,结构优雅,…...
如何实现微信聊天记录的终极掌控:WeChatMsg完全指南
如何实现微信聊天记录的终极掌控:WeChatMsg完全指南 【免费下载链接】WeChatMsg 提取微信聊天记录,将其导出成HTML、Word、CSV文档永久保存,对聊天记录进行分析生成年度聊天报告 项目地址: https://gitcode.com/GitHub_Trending/we/WeChatM…...
Mac系统Jmeter从零到一:接口压力测试实战入门
1. 为什么选择Jmeter做接口压力测试 最近接手一个需求:需要对某个关键接口进行100次循环压力测试,检查是否存在偶发性返回数据为空的问题。作为Mac用户,我第一时间想到了Jmeter这个工具。你可能好奇为什么不用Postman或者curl脚本࿱…...
OpenClaw技能扩展实战:基于nanobot开发自定义自动化模块
OpenClaw技能扩展实战:基于nanobot开发自定义自动化模块 1. 为什么需要自定义技能? 去年夏天,我经常需要在出门前手动查询天气情况,这个看似简单的动作却让我感到烦躁——打开浏览器、输入网址、输入城市、查看结果。作为一个技…...
FlashAttention 终极指南:如何实现4倍加速与20倍内存优化的革命性技术
FlashAttention 终极指南:如何实现4倍加速与20倍内存优化的革命性技术 【免费下载链接】flash-attention Fast and memory-efficient exact attention 项目地址: https://gitcode.com/GitHub_Trending/fl/flash-attention FlashAttention 是一种革命性的注意…...
