基础工具类Joiner的使用

简介: 基础工具类Joiner的使用

Guava 中有一些基础的工具类,如下所列:


Joiner 类:根据给定的分隔符把字符串连接到一起。MapJoiner 执行相同的操作,但是针对 Map 的 key 和 value。


Splitter 类:与 Joiner 操作相反的类,是根据给定的分隔符,把一个字符串分隔成若个子字符串。


CharMatcher,Strings 类:对字符串通用的操作,例如移除字符串的某一部分,字符串匹配等等操作。


其他类:针对Object操作的方法,例如 toString 和 hashCode 方法等。


一、 Joiner


这是在我们代码中出现频率比较高的一个功能。经常需要将几个字符串,或者字符串数组、集合之类的东西,拼接成一个以指定符号分隔各个元素的字符串,比如要将一个用List保存的集合拼起来作为SQL语句的条件,在知道Joiner之前我们会这样做。

// 拼接: AND goods IN(123,1234,345)
productSql.append(" AND goods IN (");
for (Long goods : spuIdList) {
  productSql.append(goods + ",");
}
productSql.delete(productSql.length() - 1, productSql.length()).append(")");

上面的代码注意的一点就是我们要移除字符串最后的一个分隔符。虽然不难,但是很无聊,下面借助 Joiner 类,代码瞬间变得优雅起来。


productSql.append(" AND goods IN (").append(Joiner.on(",").skipNulls().join(spuIdList)).append(")");

补充:


如果传入的对象中包含空指针,会直接抛出空指针异常。Joiner 提供了两个方法,让我们能够优雅的处理待拼接集合中的空指针。


如果我们希望忽略空指针,那么可以调用 skipNulls方法,得到一个会跳过空指针的 Joiner 实例。如果希望将空指针变为某个指定的值,那么可以调用 useForNull 方法,指定用来替换空指针的字符串。


Joiner.on(",").skipNulls().join(spuIdList);
Joiner.on(",").useForNull("#").join(spuIdList);
  • Joiner 不仅可以返回string ,还有方法能够处理StringBuilder类:

二、Joiner.MapJoiner

MapJoiner 是 Joiner 的内部静态类,用于帮助将 Map 对象拼接成字符串。


@Test
public void testJoiner(){
    Map<String, String> map = new HashMap<>();
    map.put("红楼梦", "刘姥姥");
    map.put("三国演义", "关羽");
    map.put("水浒传", "李逵");
    map.put("西游记", "猪八戒");
    String str = Joiner.on(" ").withKeyValueSeparator(":").join(map);
    System.out.println(str);//水浒传:李逵 红楼梦:刘姥姥 三国演义:关羽 西游记:猪八戒
}

三、常用API总结:

appendTo

// 可追加,实现了Appendable接口的都可以使用
A appendTo(A appendable, Iterable<?> parts)
// 向appendable参数后追加first、second…所有参数
A appendTo(A appendable, @Nullable Object first, @Nullable Object second, Object… rest)

比较常见的实现类: BufferedWriter, CharArrayWriter, CharBuffer, FileWriter, FilterWriter, LogStream, Ou

tputStreamWriter, PipedWriter, PrintStream, PrintWriter, StringBuffer, StringBuilder, StringWriter, Writer

用法

String[] arr = {"a","b","c"};
StringBuilder ab = new StringBuilder("start: ");
StringBuilder ac = Joiner.on("").appendTo(ab,arr);
System.out.println(ab); // start: abc
System.out.println(ac); // start: abc

Join+on

// 将可迭代的参数中所有子元素连接。
String join(Iterable<?> parts)
// 为static对象设置分隔符
static Joiner on(char separator)


Joiner实例不可变,即用final修饰,一旦初始化不可变,所以分步调用joiner的静态函数是不起作用的。如:

@Test
public void testJoiner(){
    Joiner joiner = Joiner.on(',');
    joiner.skipNulls(); // 不起作用!
    String str = joiner.join("wrong", null, "wrong");
    System.out.println(str);
}
// 会抛出 NullPointerException

这样使得joiner线程安全,并且返回的都是final static常量

其他

Joiner skipNulls()
Joiner useForNull(String nullText)
Joiner.MapJoiner withKeyValueSeparator(String keyValueSeparator)

最后


大家有兴趣的可以去了解下Guava中其他类的用法,源码写的也很棒!


附上链接:


Joinner源码解析:https://blog.csdn.net/dancheng1/article/details/84819034


强大的Google Guava类库: https://cloud.tencent.com/developer/article/2035964


Guava库使用:https://blog.csdn.net/weixin_44139651/article/details/123804181


效率提升神器之Guava-Joiner:https://baijiahao.baidu.com/s?id=1736921815066348757&wfr=spider&for=pc


相关文章
|
C++
UE4/5中DataTable数据表的使用
UE4/5中DataTable数据表的使用
1527 1
UE4/5中DataTable数据表的使用
|
小程序
微信小程序文件上传无响应解决方法
微信小程序文件上传无响应解决方法
1756 0
|
3月前
|
人工智能 安全 数据可视化
安全测试平台的选型标准与搭建思路
随着企业安全需求升级,传统漏洞扫描和渗透测试已无法满足要求。构建安全测试平台(STP)成为趋势,实现漏洞扫描、权限评估、接口测试等工作的平台化运营。本文从选型标准、平台架构、模块功能等六个方面,系统讲解如何搭建企业级安全测试平台,提升安全能力。
|
7月前
|
数据采集 搜索推荐 API
Python 原生爬虫教程:京东商品列表页面数据API
京东商品列表API是电商大数据分析的重要工具,支持开发者、商家和研究人员获取京东平台商品数据。通过关键词搜索、分类筛选、价格区间等条件,可返回多维度商品信息(如名称、价格、销量等),适用于市场调研与推荐系统开发。本文介绍其功能并提供Python请求示例。接口采用HTTP GET/POST方式,支持分页、排序等功能,满足多样化数据需求。
|
6月前
|
人工智能 运维 算法
AI加持下的网络流量管理:智能调度还是流量黑洞?
AI加持下的网络流量管理:智能调度还是流量黑洞?
243 8
|
11月前
|
SQL NoSQL Java
Java使用sql查询mongodb
通过使用 MongoDB Connector for BI 和 JDBC,开发者可以在 Java 中使用 SQL 语法查询 MongoDB 数据库。这种方法对于熟悉 SQL 的团队非常有帮助,能够快速实现对 MongoDB 数据的操作。同时,也需要注意到这种方法的性能和功能限制,根据具体应用场景进行选择和优化。
425 9
|
12月前
|
存储 传感器 算法
如何选择合适的 CRC 多项式
CRC(循环冗余校验)多项式的选取对数据传输的错误检测至关重要。选择时需考虑多项式的长度、检测性能及实现复杂度,常用多项式有CRC-8、CRC-16、CRC-32等,适用于不同场景以确保高效准确的错误检测。
1154 4
|
存储 JSON 前端开发
🔥基于GitHub的Electron自动发布与更新🔥
🔥基于GitHub的Electron自动发布与更新🔥
|
分布式计算 算法 调度
DAG(有向无环图)在Spark中的应用
DAG(有向无环图)在Spark中的应用
1077 0
|
存储 编解码 分布式计算
简单说一下阿里云OSS在哪些应用场景里应用。
简单说一下阿里云OSS在哪些应用场景里应用。
1209 0