Java中的StringJoiner

在Java开发中,我们经常需要将多个字符串或数组元素用指定分隔符拼接起来,例如生成CSV格式的文本、SQL语句中的字段列表等。虽然StringBuilder可以完成这类任务,但处理分隔符时往往需要额外的逻辑来避免首尾多余的分隔符。StringJoiner作为Java 8 引入的专门用于字符串拼接的工具类,完美解决了这一问题,让分隔符拼接变得简洁优雅。

StringJoiner的基本用法

StringJoiner的设计初衷就是简化带分隔符的字符串拼接操作,它能自动处理分隔符的添加,避免在首尾出现多余的分隔符。

基本构造与使用

import java.util.StringJoiner;

public class StringJoinerBasic {
public static void main(String[] args) {
// 创建StringJoiner,指定分隔符为逗号加空格
StringJoiner sj = new StringJoiner(", "); // 添加元素
sj.add("Apple");
sj.add("Banana");
sj.add("Orange"); // 转换为字符串
String result = sj.toString();
System.out.println(result); // 输出:Apple, Banana, Orange
}
}

这段代码实现了用", "分隔多个水果名称的功能,无需手动处理最后一个分隔符的去除,StringJoiner会自动管理分隔符的添加。

带前缀和后缀的拼接

StringJoiner的另一个实用特性是可以指定拼接结果的前缀和后缀:

public class StringJoinerWithPrefixSuffix {
public static void main(String[] args) {
// 构造方法:分隔符、前缀、后缀
StringJoiner sj = new StringJoiner(", ", "Hello ", "!"); sj.add("Bob");
sj.add("Alice");
sj.add("Grace"); System.out.println(sj.toString()); // 输出:Hello Bob, Alice, Grace!
}
}

在这个例子中:

  • 第一个参数是分隔符(", ")
  • 第二个参数是前缀("Hello ")
  • 第三个参数是后缀("!")

最终结果自动包含前缀和后缀,且元素间用指定分隔符分隔。

String.join():简化的拼接方法

对于不需要前缀和后缀的简单拼接场景,String类提供了静态方法join(),它内部基于StringJoiner实现,使用更加简洁:

public class StringJoinExample {
public static void main(String[] args) {
String[] fruits = {"Apple", "Banana", "Orange"}; // 使用String.join()拼接数组
String result = String.join(" | ", fruits);
System.out.println(result); // 输出:Apple | Banana | Orange // 拼接多个字符串字面量
String names = String.join(" & ", "Alice", "Bob", "Charlie");
System.out.println(names); // 输出:Alice & Bob & Charlie
}
}

String.join()的语法非常直观:

  • 第一个参数是分隔符
  • 后续参数是要拼接的元素(可以是数组或可变参数)

StringJoiner其他使用

合并两个StringJoiner

StringJoiner提供了merge()方法,可以将另一个StringJoiner的内容合并进来,且会自动处理分隔符:

public class StringJoinerMerge {
public static void main(String[] args) {
StringJoiner sj1 = new StringJoiner(", ", "[", "]");
sj1.add("A").add("B"); StringJoiner sj2 = new StringJoiner(" | ", "<", ">");
sj2.add("X").add("Y"); // 合并sj2到sj1
sj1.merge(sj2); System.out.println(sj1.toString()); // 输出:[A, B, X, Y]
}
}

注意:合并时会使用当前StringJoiner的分隔符,而不是被合并对象的分隔符。

处理空值情况

StringJoiner没有添加任何元素时,默认会返回空字符串。我们可以在构造时指定一个默认值,用于没有元素的情况:

public class StringJoinerEmptyValue {
public static void main(String[] args) {
// 指定空值时的默认字符串
StringJoiner sj = new StringJoiner(", ", "{", "}", "empty"); System.out.println(sj.toString()); // 输出:empty sj.add("test");
System.out.println(sj.toString()); // 输出:{test}
}
}

总结

  • StringJoiner支持指定分隔符、前缀和后缀,自动管理分隔符添加
  • String.join()是简化版的拼接方法,适合不需要前缀后缀的场景

Java核心类——3.StringJoiner的更多相关文章

  1. 从字节码和JVM的角度解析Java核心类String的不可变特性

    1. 前言 最近看到几个有趣的关于Java核心类String的问题. String类是如何实现其不可变的特性的,设计成不可变的好处在哪里. 为什么不推荐使用+号的方式去形成新的字符串,推荐使用Stri ...

  2. Java核心类

    Java核心类的学习: 常用类库 io流 集合 多线程 网络编程 调试与优化 XML和JSON 枚举.注解和反射 设计模式

  3. Day1 面向对象编程与Java核心类

    this变量 在方法内部,可以使用一个隐含的变量this,它始终指向当前实例.如果没有命名冲突,可以省略this. 但是,如果有局部变量和字段重名,那么局部变量优先级更高,就必须加上this. 构造方 ...

  4. Java基础学习笔记二十三 Java核心语法之反射

    类加载器 类的加载 当程序要使用某个类时,如果该类还未被加载到内存中,则系统会通过加载,链接,初始化三步来实现对这个类进行初始化. 加载就是指将class文件读入内存,并为之创建一个Class对象.任 ...

  5. Java——String类中的compareTo方法总结

    String类的定义:    java.lang  类 String   java.lang.Object      java.lang.String 所有已实现的接口:Serializable, C ...

  6. 到头来还是逃不开Java - Java13核心类

    Java13核心类 没有特殊说明,我的所有学习笔记都是从廖老师那里摘抄过来的,侵删 引言 兜兜转转到了大四,学过了C,C++,C#,Java,Python,学一门丢一门,到了最后还是要把Java捡起来 ...

  7. Java学习_Java核心类

    字符串和编码 字符串在String内部是通过一个char[]数组表示的,因此,可以按下面的写法: String s2 = new String(new char[] {'H', 'e', 'l', ' ...

  8. Java入门到精通——框架篇之Spring源码分析Spring两大核心类

    一.Spring核心类概述. Spring里面有两个最核心的类这是Spring实现最重要的部分. 1.DefaultListableBeanFactory 这个类位于Beans项目下的org.spri ...

  9. 深入Java核心 Java中多态的实现机制(1)

    在疯狂java中,多态是这样解释的: 多态:相同类型的变量,调用同一个方法时,呈现出多中不同的行为特征, 这就是多态. 加上下面的解释:(多态四小类:强制的,重载的,参数的和包含的) 同时, 还用人这 ...

  10. Java核心:类加载和JVM内存的分配

    类的加载: 指的是将class文件的二进制数据读入到运行时数据区(JVM在内存中划分的) 中,并在方法区内创建一个class对象. 类加载器: 负责加载编译后的class文件(字节码文件)到JVM(J ...

随机推荐

  1. 基于 Streamlit 和 OpenAI 实现的小红书爆款文案生成器

    项目介绍 在当今自媒体时代,高质量的文案是吸引流量的关键.特别是在小红书这样的平台上,一个吸引人的标题和富有情感的正文可以显著提高内容的曝光率. 本文将介绍一个基于OpenAI API和Streaml ...

  2. .NET 开源工业视觉系统 OpenIVS 快速搭建自动化检测平台

    前言 随着工业4.0和智能制造的发展,工业视觉在质检.定位.识别等场景中发挥着越来越重要的作用.然而,开发一个完整的工业视觉系统往往需要集成相机控制.图像采集.图像处理.AI推理.PLC通信等多个模块 ...

  3. Java HashMap和 ConcurrentHashMap 热门面试题

    目录 在日常开发中使用过的java集合类有哪些 谈一下HashMap的特性 HashMap 的数据结构是什么 单链表和红黑树相互转换的条件是什么 链表和红黑树相互转换的阈值为什么是 8 和 6 为什么 ...

  4. python doc转png踩坑历程分享

    首先python根据文本内容生成doc,使用的是python-docx库,使用示例如下: from docx import Document from docx.shared import Pt, R ...

  5. 代码随想录第二天|数组part02

    开始时间10:30 209.长度最小的子数组 题目建议: 本题关键在于理解滑动窗口,这个滑动窗口看文字讲解 还挺难理解的,建议大家先看视频讲解. 拓展题目可以先不做. 题目链接:https://lee ...

  6. kubernetes集群之GC处理

    一.简单说明 GC(Garbage Collector)即垃圾收集清理,kubernetes集群中,kubelet的GC功能将会清理未使用的image和container.其中kubelet对cont ...

  7. 直播预告丨《Flink提交流程&如何debug和跟踪流程(on yarn)》

    4月20日晚19点30分,袋鼠云数栈技术研发团队开发工程师--莫问,将会为大家直播分享<Flink提交流程&如何debug和跟踪流程(on yarn)>. 课程内容主要包括以下三点 ...

  8. [noip2024游记] 这才是真正的功德流(

    [noip2024游记] 这才是真正的功德流 从现在起呆猫会使用短分段了! day -7~-2 最后一周了,但不是太紧张啊 最后一次玩飞盘了,为什么只有\(noip\)前有飞盘/ll 学校的猫猫好可爱 ...

  9. JavaScript的"数值计算困局":生态缺位下的破局之路

    本文原创首发于公众号[我做开发那些年]与网站[乔文小屋],现同步转载至本平台,点击阅读原文 声明:如需转载本文至其他平台,请注明文章来源及公众号信息,感谢您对原创内容的尊重与支持! *背景*:最近在尝 ...

  10. Blazor学习之旅(9)用MudBlazor重构Todo

    大家好,我是Edison. 在之前的学习之旅(3)开发一个Todo应用中,我们开发了一个简单版的Todo,这次我们基于MudBlazor来重构这个Todo应用. Todo V1回顾 在Blazor入门 ...