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

优雅拼接字符串: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

四、注意事项

  1. 版本兼容性:需Java 8及以上环境。
  2. 空值处理:默认允许添加null,但会转换为字符串"null",建议提前过滤。
  3. 性能:底层依赖StringBuilder,适用于常规数据量,超大数据建议直接操作StringBuilder

结语

StringJoiner以极简的设计解决了字符串拼接中的常见痛点,尤其在与Stream API结合时,能大幅提升代码的简洁性和可维护性。无论是日志格式化、数据导出,还是动态查询构建,掌握StringJoiner都能让你的代码更加优雅高效。

相关文章:

优雅拼接字符串:StringJoiner 的完整指南

在Java开发中&#xff0c;字符串拼接是高频操作。无论是日志格式化、构建CSV数据&#xff0c;还是生成动态SQL&#xff0c;开发者常需处理分隔符、前缀和后缀的组合。传统的StringBuilder虽然灵活&#xff0c;但代码冗余且易出错。Java 8推出的StringJoiner类&#xff0c;以简洁…...

AFL++安装

学习fuzzing也几天了&#xff0c;今天记录AFL的安装及使用 一、实验环境 虚拟机&#xff1a;ubuntu20.04 当然也可以uname -a去看自己的版本号 二、AFL安装 1.先更新一下工具 sudo apt update2.安装AFL必要的一些依赖&#xff0c;例如编译工具&#xff08;如 build-essen…...

开发者社区测试报告(功能测试+性能测试)

功能测试 测试相关用例 开发者社区功能背景 在当今数字化时代&#xff0c;编程已经成为一项核心技能&#xff0c;越来越多的人开始学习编程&#xff0c;以适应快速变化的科技 环境。基于这一需求&#xff0c;我设计开发了一个类似博客的论坛系统&#xff0c;专注于方便程序员…...

如何优化 VS Code 远程开发环境?高效配置与性能提升策略

相关系列文章 《新手教学系列——善用 VSCode 工作区,让开发更高效》 《新手教学系列——用 VSCode 实现高效远程开发》 《Webpack 优化全攻略:彻底解决 Vue 项目 npm run dev 的内存泄露问题》 引言 随着开发环境不断进化,VS Code 作为一款轻量级的代码编辑器,已经成为…...

【二】JavaScript能力提升---this对象

目录 this的理解 this的原理 事件绑定中的this 行内绑定 动态绑定 window定时器中的this 相信小伙伴们看完这篇文章&#xff0c;对于this的对象可以有一个很大的提升&#xff01; this的理解 对于this指针&#xff0c;可以先记住以下两点&#xff1a; this永远指向一个…...

YC 孵化项目 Pinch:实时语音翻译视频会议平台;Mistral OCR:能处理多语言多模态复杂文档丨日报

开发者朋友们大家好&#xff1a; 这里是 「RTE 开发者日报」 &#xff0c;每天和大家一起看新闻、聊八卦。 我们的社区编辑团队会整理分享 RTE&#xff08;Real-Time Engagement&#xff09; 领域内「有话题的 技术 」、「有亮点的 产品 」、「有思考的 文章 」、「有态度的 …...

OSPF报文分析

OSPF报文分析 组播地址 224.0.0.0&#xff5e;224.0.0.255为预留的组播地址&#xff08;永久组地址&#xff09;&#xff0c;地址224.0.0.0保留不做分配&#xff0c;其它地址供路由协议使用&#xff1b; 224.0.1.0&#xff5e;238.255.255.255为用户可用的组播地址&#xff08;…...

蓝桥杯刷题周计划(第二周)

目录 前言题目一题目代码题解分析 题目二题目代码题解分析 题目三题目代码题解分析 题目四题目代码题解分析 题目五题目代码题解分析 题目六题目代码题解分析 题目七题目代码题解分析 题目八题目题解分析 题目九题目代码题解分析 题目十题目代码题解分析 题目十一题目代码题解分…...

PH热榜 | 2025-03-09

1. ResumeUp 2.0 标语&#xff1a;聊聊&#xff0c;几分钟内就能帮助你打造完美的ATS简历。 介绍&#xff1a;告别为写完美简历而烦恼的日子吧&#xff01;只需与人工智能聊天&#xff0c;回答几个简单的问题&#xff0c;就能在几分钟内生成强有力的简历&#xff0c;不仅能通…...

《gradio :AI demos》

《gradio &#xff1a;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之数据解析器使用方法

一、背景与需求 在汽车电子领域&#xff0c;UDS&#xff08;Unified Diagnostic Services&#xff09;协议栈的响应报文解析是实现ECU诊断功能的核心环节。本文提出一种基于配置驱动的通用解析器开发方案&#xff0c;满足以下行业需求&#xff1a; 多协议兼容性&#xff1a;支…...

从0开始完成基于异步服务器的boost搜索引擎

文章目录 前言一、本项目涉及的技术栈和环境二、boost是什么&#xff1f;三、项目的相关背景四、项目的相关原理五、正排索引 vs 倒排索引 - 搜索引擎具体原理六、 编写数据去标签与数据清洗的模块 Parser6.1 下载boost的文档库6.2 去标签6.3 代码编写 七、索引模块7.1. 整体框…...

炒菜本质是 “能量(火候)与食材特性”的动态平衡

炒菜看似简单&#xff0c;但想要做到色香味俱全&#xff0c;需遵循一套清晰的逻辑链条。以下从底层逻辑到实操步骤拆解&#xff1a; 一、核心逻辑&#xff1a;控制变量&#xff0c;精准匹配 炒菜本质是 “能量&#xff08;火候&#xff09;与食材特性”的动态平衡&#xff0c;…...

AI Copilot——维新派的贾维斯,守旧派的墓志铭(程序员视角)

6500万年前的那颗陨石好像要落下来了 这一段时间&#xff0c;伴随着claude sonnet 3.7的发布 以及cursor&#xff0c;windsurf 等一众AI智能编辑器的涌现&#xff0c;社区的programming自媒体坐不住了&#xff0c;有一个观点已经快要溢出屏幕&#xff1a;程序员这个岗位要黄&a…...

Java Spring MVC (2)

常见的Request Controller 和 Response Controller 的区别 用餐厅点餐来理解 想象你去一家餐厅吃饭&#xff1a; Request Controller&#xff08;接单员&#xff09;&#xff1a;负责处理你的点餐请求&#xff0c;记录你的口味、桌号等信息。Response Controller&#xff08…...

对开源VLA sota π0的微调——如何基于各种开源数据集、以及你自己的私有数据集微调π0(含我司的微调实践)

前言 25年2.4日&#xff0c;几个月前推出π0的公司Physical Intelligence (π)宣布正式开源π0及π0-FAST&#xff0c;如之前所介绍的&#xff0c;他们对用超过 10,000 小时的机器人数据进行了预训练 该GitHub代码仓库「 π0及π0-FAST的GitHub地址&#xff1a;github.com/Ph…...

[排序算法]直接插入排序

1.基本思想 直接插入排序是一种简单的插入排序法&#xff0c;其基本思想是&#xff1a;把待排序的记录按其关键码值的大小逐个插入到一个已经排好序的有序序列中&#xff0c;直到所有的记录插入完为止&#xff0c;得到一个新的有序序列。 实际中我们玩扑克牌时&#xff0c;就用…...

四、云原生应用监控-Etcd

Etcd 是 Kubernetes 内部核心组件之一,作为分布式键值存储,天然支持 Prometheus 监控,自带 /metrics 端点,可直接被 Prometheus 抓取。 Etcd监控需要使用到证书。 一、检查云原生Etcd 检查节点上的Etcd [root@k8s-master01 manifests]#netstat -lnpt |grep etcd tcp …...

STM32-I2C通信外设

目录 一&#xff1a;I2C外设简介 二&#xff1a;I2C外设数据收发 三&#xff1a;I2C的复用端口 四&#xff1a;主机发送和接收 五&#xff1a;硬件I2C读写MPU6050 相关函数&#xff1a; 1.I2C_ GenerateSTART 2.I2C_ GenerateSTOP 3.I2C_ AcknowledgeConfig 4.I2C…...

CTA策略【量化理论】

CTA策略演变史 全称&#xff1a;Commodity Trading Advisor &#xff08;商品交易顾问&#xff09; CTA最开始是指通过为客户提供期权、期货方面的交易建议&#xff0c;或者直接通过受管理的期货账户参与实际交易&#xff0c;来获得收益的机构或个人。 随着市场的发展&#…...

基于AMD AU15P FPGA的SLVS-EC桥PCIe设计方案分享

作者&#xff1a;Hello,Panda 各位FPGAer周末愉快&#xff0c;今天熊猫君分享一个基于AMD AU15P FPGA的SLVS-EC桥PCIe设计方案。 一、方案背景 先说方案的应用背景&#xff1a;众所周知&#xff0c;较为上层的如基于AI的机器视觉应用&#xff0c;大多基于高端的专用SoC、AI专…...

②Modbus TCP转Modbus RTU/ASCII网关同步采集无需编程高速轻松组网

Modbus TCP转Modbus RTU/ASCII网关同步采集无需编程高速轻松组网https://item.taobao.com/item.htm?ftt&id784749793551 网关 MS-A1-5081 MS-A1-5081 网关通过 MODBUS TCP 协议与 Modbus RTU/ASCII 协议的相互转换&#xff0c;可以将 Modbus 串口设备接入 MODBUS TCP 网络…...

游戏引擎学习第145天

仓库:https://gitee.com/mrxiao_com/2d_game_3 今天的计划 目前&#xff0c;我们正在完成遗留的工作。当时我们已经将声音混合器&#xff08;sound mixer&#xff09;集成到了 SIMD 中&#xff0c;但由于一个小插曲&#xff0c;没有及时完成循环内部的部分。这个小插曲主要是…...

【Kotlin】Kotlin基础笔记

一、数据类型 1.1 变量声明与类型推导 变量声明 使用 val 声明不可变变量&#xff08;相当于常量&#xff09;&#xff1b;使用 var 声明可变变量。 val a 10 // 类型自动推断为 Int&#xff0c;不可变 var b: Double 5.0 // 显示声明为 Double&#xff0c;可变变量…...

Jump( 2015-2016 ACM-ICPC Northeastern European Regional Contest (NEERC 15). )

Jump( 2015-2016 ACM-ICPC Northeastern European Regional Contest (NEERC 15). ) 题目大意&#xff1a; 在这个交互式问题中&#xff0c;你需要通过查询系统&#xff0c;逐步找出隐藏的位字符串 S。给定一个偶数 n&#xff0c;表示目标位字符串 S 的长度&#xff0c;你需要通…...

uniapp uniCloud引发的血案(switchTab: Missing required args: “url“)!!!!!!!!!!

此文章懒得排版了&#xff0c;为了找出这个bug, 星期六的晚上我从9点查到0点多&#xff0c;此时我心中一万个草泥马在崩腾&#xff0c;超级想骂人&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01; uniCloud 不想…...

【Linux】冯诺依曼体系与操作系统理解

&#x1f31f;&#x1f31f;作者主页&#xff1a;ephemerals__ &#x1f31f;&#x1f31f;所属专栏&#xff1a;Linux 目录 前言 一、冯诺依曼体系结构 二、操作系统 1. 操作系统的概念 2. 操作系统存在的意义 3. 操作系统的管理方式 4. 补充&#xff1a;理解系统调用…...

STM32之软件SPI

SPI传输更快&#xff0c;最大可达80MHz&#xff0c;而I2C最大只有3.4MHz。输入输出是分开的&#xff0c;可以同时输出输入。是同步全双工。仅支持一主多从。SS是从机选择线。每个从机一根。SPI无应答机制的设计。 注意&#xff1a;所有设备需要共地&#xff0c;时钟线主机输出&…...

Python零基础学习第三天:函数与数据结构

一、函数基础 函数是什么&#xff1f; 想象你每天都要重复做同一件事&#xff0c;比如泡咖啡。函数就像你写好的泡咖啡步骤说明书&#xff0c;每次需要时直接按步骤执行&#xff0c;不用重新想流程。 # 定义泡咖啡的函数 def make_coffee(sugar1): # 默认加1勺糖 print("…...

启动wsl里的Ubuntu24报错:当前计算机配置不支持 WSL2,HCS_E_HYPERV_NOT_INSTALLED

问题&#xff1a;启动wsl里的Ubuntu24报错 报错信息&#xff1a; 当前计算机配置不支持 WSL2。 请启用“虚拟机平台”可选组件&#xff0c;并确保在 BIOS 中启用虚拟化。 通过运行以下命令启用“虚拟机平台”: wsl.exe --install --no-distribution 有关信息&#xff0c;请访…...