文档章节

Guava字符串操作

ddfeye
 ddfeye
发布于 2015/12/08 20:00
字数 1202
阅读 76
收藏 0

guava中封装了我们在开发中经常使用的字符串拼接和分割的操作。

通过提供方法链的方式,使这些操作变得一气呵成。下面通过一些实例分别介绍下。

字符串拼接

com.google.common.base.Joiner

这个类的代码比较简单,

1、把构造函数设置成private,提供两个重载的静态构造方法 

public static Joiner on(String separator) {
  return new Joiner(separator);
}
public static Joiner on(char separator) {
  return new Joiner(String.valueOf(separator));
}

2、提供几个实例链式方法

public Joiner skipNulls();
public Joiner useForNull(final String nullText);
public MapJoiner withKeyValueSeparator(String keyValueSeparator);

这里的链式方法是我给取得名字,就是类中的实例方法的返回值是该类或者该类的子类。

上面的MapJoiner 是Joiner类中的内部类,同时是Joiner的子类。

3、提供了好些个重载的操作方法,主要有两种 

第一种是

public <A extends Appendable> A appendTo(A appendable, Iterable<?> parts) throws IOException {
  return appendTo(appendable, parts.iterator());
}

这里是一个泛型方法,第一个参数限定为Appendable的子类,为了方便同时提供了第一个参数为StringBuilder的版本

其他的重载方法都是改变了第二个参数的形式,第二参数可以是Iterable Iterator Object[] 或者 Object 的可变参数

第二种是 

public final String join(Iterable<?> parts) {
return join(parts.iterator());
}

其实内部也是调用的appendTo方法,只是在方法内部new 一个StringBuilder 传入appendTo方法。

下面可以看一些代码

List<String> list = Lists.newArrayList("北京", "上海", "广州");
System.out.println(Joiner.on(',').join(list)); // 北京,上海,广州
StringBuilder builder = new StringBuilder();
list.add(null);
System.out.println(Joiner.on(',').skipNulls().appendTo(builder, list)); // 北京,上海,广州
System.out.println(Joiner.on(',').useForNull("深圳").join(list)); // 北京,上海,广州,深圳

上面的代码中使用Guava中的集合工具类Lists(后面会再做介绍)

若不使用guava,就需要写一个循环然后判断元素是否为null,处理null。

而guava为我们封装好了这些,只需一行代码就搞定,非常简洁。

除了拼接Iterable集合以及数组,我们还可以很方便拼接Map

ImmutableMap<String, Integer> map = ImmutableMap.of("北京", 2151, "上海", 2425, "广州", 1308);
//北京 -> 2151#上海 -> 2425#广州 -> 1308
System.out.println(Joiner.on("#").withKeyValueSeparator(" -> ").join(map));

使用keyValueSeparator -> 来连接map中的key和value然后再用separator #将多个项连接

字符串分割

com.google.common.base.Splitter

这个类的结构基本与Joiner类同

也是把构造函数定义为private,提供了几个静态构造方法

public static Splitter on(char separator); // 分隔符为字符串完全匹配
public static Splitter on(final String separator); // 分隔符为字符串完全匹配
public static Splitter on(final CharMatcher separatorMatcher); // 分隔符采用Guava中的CharMatcher来匹配
public static Splitter on(final Pattern separatorPattern); // 分隔符采用正则表达式匹配

也提供了几个链式方法,来配置相关属性定义不同的处理方式

public Splitter limit(int limit); //定义分隔后的最大项数
public Splitter trimResults(); // 去除每一项中的空白字符
public Splitter trimResults(CharMatcher trimmer);// 去除每一项中的trimmer匹配的字符
public static Splitter fixedLength(final int length); //分割每一项为固定长度

对字符串进行分割的主要逻辑是在Splitter中的内部类SplittingIterator中实现的

SplittingIterator 提供了两个抽象方法给子类实现,

abstract int separatorStart(int start);// 确定分隔符从被分割字符串start位置处出现的index
abstract int separatorEnd(int separatorPosition);// 确定分隔符的结算位置

因为这里根据静态构造方法on中出入的参数不同,分割的策略不同。

List<String> strings = Splitter.on(CharMatcher.anyOf(";,")).splitToList("foo;,boo,test");
for (String s : strings) {
System.out.println(s);
}

输出四个字符串,中间还包含一个空字符串

foo


boo

test

要去掉空字符串也是异常简单

strings = Splitter.on(CharMatcher.anyOf(":,")).omitEmptyStrings().splitToList("foo;,boo,test");
for (String s : strings) {
System.out.println(s);
}

这里再对比下Splitter与Apache commons中的StringUtils的区别

对于分隔符在字符串首尾的情况

List<String> list = Splitter.on(',').splitToList(",test,");
String[] arr = StringUtils.split(",test,", ',');
System.out.println("Splitter output size " + list.size() + ", StringUtils output size " + arr.length);
for (String item : list) {
System.out.println(item);
}
System.out.println("===============");
for (String str : arr) {
System.out.println(str);
}

输出为

Splitter output size 3, StringUtils output size 1


test


===============

test

Splitter输出的3个元素,而StringUtils输出只有1个,Splitter的输出更容易理解和接受。

Splitter也采用了Guava中一贯的lazy原则,提供了一个lazy的接口

//这个接口只是返回了Iterable接口,具体的分割操作是在遍历Iterable接口时才处理的
public Iterable<String> split(final CharSequence sequence); 
// 这个接口返回List,具体的分割操作已经执行完成
public List<String> splitToList(CharSequence sequence);



© 著作权归作者所有

共有 人打赏支持
ddfeye
粉丝 0
博文 4
码字总数 4470
作品 0
广州
私信 提问
Google Guava 中文指南

温馨提示:Guava 中文指南的 GitHub 地址为 guava-guide,欢迎大家、,纠错。 Guava 中文指南   Guava 项目包含若干被 Google 的 Java 项目依赖的核心类库,例如:集合、缓存、原生类型支持...

qq_35246620
2017/09/13
0
0
Google Guava教程

Google Guava官方教程(中文版) 原文链接 译文链接 译者: 沈义扬,罗立树,何一昕,武祖 校对:方腾飞 引言 Guava工程包含了若干被Google的 Java项目广泛依赖 的核心库,例如:集合 [colle...

casoc
2015/10/12
343
0
guava 实用操作集合

guava是 google 几个java核心类库的集合,包括集合、缓存、原生类型、并发、常用注解、基本字符串操作和I/O等等。 大家平时经常遇到某些相同的问题,自己写代码也都能解决。但是久而久之会感觉...

Atom_me
2016/01/01
204
1
Guava 教程2-深入探索 Google Guava 库

在这个系列的第一部分里,我简单的介绍了非常优秀的Google collections和Guava类库,并简要的解释了作为Java程序员,如果使用Guava库来减少项目中大量的样板代码。在这篇博文中我们将深入挖掘...

se77en
2013/01/30
7.9K
6
GUAVA常用方法总结整理(list map string concurrent file)

1.对字符串的操作: 2.FluentIterable迭代器: Guava提供了可以在Iterator中进行处理的功能更丰富的迭代器, 其实就像是加了一个代理, 增加一些功能。 3.Lists列表: Table矩阵: 使用Guava...

李矮矮
2016/09/17
106
0

没有更多内容

加载失败,请刷新页面

加载更多

nacos之springboot

本地操作系统:ubuntu18,我使用docker的方式启动nacos服务 docker image方式启动nacos 在docker hub上可以搜到nacos-server List-1.1 拉去最新的版本 mjduan@mjduan-ubuntu:/opt/software$ ...

克虏伯
25分钟前
2
0
指针数组和数组指针的区别

这两个名字不同当然所代表的意思也就不同。我刚开始看到这就吓到了,主要是中文太博大精深了,整这样的简称太专业了,把人都绕晕了。从英文解释或中文全称看就比较容易理解。 指针数组:arr...

天王盖地虎626
57分钟前
3
0
Qt那些事0.0.18

今天要记一下Qt中的Resource。自我感觉理解的不错,但是还会难免有谬误,在日后有可能会更新,也有可能不会。 小声的念叨一句,女人心,海底针。 今天就直接跳过了关于QML在qrc文件中的介绍,...

Ev4n
今天
2
0
深入解析js的作用域、预解析机制

虽然,ES6在我们工作中应用得越来越广泛,但是还是很多项目保留着ES5的写法,所以,今天,带着大家重新巩固下ES5下的作用域及预解析机制。 概念: 作用域:域,指的是一个空间、范围、区域,...

前端攻城老湿
今天
2
0
Spring Cloud Feign - 声明式 REST Client

1、Feign是什么 声明式REST client,来自NetFlix。 允许你编写无实现代码调用REST services 替换RestTemplate(甚至更简单) Spring Cloud 为使用Feign提供了包装器 2、怎样使用Feign 对比:...

Benz001
今天
8
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部