Guava字符串处理Joiner、Splitter

                        Guava字符串处理Joiner、Splitter
 

 参考:https://blog.csdn.net/u012410733/article/details/51584086
https://www.cnblogs.com/whitewolf/p/4214749.html
https://blog.csdn.net/zbw18297786698/article/details/73223574


pom.xml

<dependency> 
<groupId>com.google.guava</groupId> 
<artifactId>guava</artifactId> 
<version>27.0.1-jre</version> 
</dependency>

先介绍com.google.common.base.Joiner。我想做为一个程序员我们每天和String打交道的时候是会占很多时间的吧。以任意的字符串和与一些分隔符标记连接在一起也是我们工作中经常要遇到的问题。但是用Guava--Joiner,它会让我们更加优雅的编码。它通常涉及把一个数组,列表,或者一个iterable和循环的内容,添加StringBuilder类项目,添加分隔符。先把Joiner的方法简单的描述一下。

A<A extends Appendable> appendTo(A appendable, Iterable<?> parts)
用来存在放通过解析预先配置的分隔符后与Iterable类型parts解析后的字符串
 
A <A extends Appendable> appendTo(A appendable, Iterator<?> parts)
用来存在放通过解析预先配置的分隔符后与Iterator类型parts解析后的字符串
 
A <A extends Appendable> appendTo(A appendable, Object[] parts)
用来存在放通过解析预先配置的分隔符后与Object[]类型parts解析后的字符串
 
A <A extends Appendable> appendTo(A appendable, Object first, Object second, Object... rest)
用来存在放通过解析预先配置的分隔符后与Object...类型parts解析后的字符串
 
StringBuilder appendTo(StringBuilder builder, Iterable<?> parts)
用来存在放通过解析预先配置的分隔符后与Iterable类型parts解析后的字符串
 
StringBuilder appendTo(StringBuilder builder, Iterator<?> parts)
用来存在放通过解析预先配置的分隔符后与Iterator类型parts解析后的字符串
 
StringBuilder appendTo(StringBuilder builder, Object[] parts)
用来存在放通过解析预先配置的分隔符后与Object[]类型parts解析后的字符串
 
StringBuilder appendTo(StringBuilder builder, Object first, Object second, Object... rest)
用来存在放通过解析预先配置的分隔符后与Object...类型parts解析后的字符串
 
String	join(Iterable<?> parts)
返回一个String在Iterable<?> parts每个数据中间添加上基于之前配置的分隔符
 
String	join(Iterator<?> parts)
返回一个String在Iterator<?> parts每个数据中间添加上基于之前配置的分隔符
 
String	join(Object[] parts)
返回一个String在Object[] parts每个数据中间添加上基于之前配置的分隔符
 
String	join(Object first, Object second, Object... rest)
返回一个String在Object... parts每个数据中间添加上基于之前配置的分隔符
 
static Joiner on(char separator)
返回一个Joiner对象用来自己替换在连接的元素中char类型分隔符
 
static Joiner on(String separator)
返回一个Joiner对象用来自己替换在连接的元素中String类型分隔符
 
Joiner	skipNulls()
返回一个Joiner对象但是会跳过连接元素中为null的元素
 
Joiner	useForNull(String nullText)
返回一个Joiner对象但是会把为null的元素替换为String类型的nullText
 
Joiner.MapJoiner withKeyValueSeparator(String keyValueSeparator)
返回一个MapJoiner对象,用于添加到间隔Map中的Entity(而on()方法是替换key与value之间)。
是Splitter.withKeyValueSeparator()的逆运算。


首先我们来看看下面我们经常遇见的一个案例:

题目:
对于一个如下定义List

   List<String> list = new ArrayList<String>("1", "2", null, “3”);

按照’,’分割,并过滤掉null。

 如果不用第三方库,如common-lange,Guava,用原生java,我们将怎么继续?

public static String join(List stringList, String delimiter) {

    StringBuilder builder = new StringBuilder();

    for (Object item : stringList) {

        if (item != null) {

            builder
             .append(item)
             .append(delimiter);

         }

    }

   builder.setLength(builder.length() delimiter.length());

   return builder.toString();

}

是不是很简单,但是繁琐,而且这里还有个坑,我们使用append的方式,在每次for完成后,我们必须去修正remove最后的分隔符:builder.setLength(builder.length() -  delimiter.length());

Guava版本呢?

public static String joinByGuava(List stringList, String delimiter) {

      return    Joiner
                 .on(delimiter)
                 .skipNulls()
                 .join(stringList);
  }

我们不在考虑更多的细节,并且很有语义的告诉代码的阅读者,用什么分隔符,需要过滤null值再join。

 

Splitter


去除分隔结果为空格的数据,使用omitEmptyStrings

public static void main(String[] args) {
        String str = "a,b,     c,,d";
        Iterable<String> result = Splitter.on(',')//设置分隔符
                .omitEmptyStrings() //用于去除为空格的分割结果
                .split(str); //要分割的字符串
        System.out.println("--start--");
        for (String s : result) {
            System.out.println(s);
        }
        System.out.println("--end--");
    }


去除分隔结果的前后空格,trimResults()

public static void main(String[] args) {
        String str = "a, b ,     c,,d";
        Iterable<String> result = Splitter.on(',')//设置分隔符
                .trimResults() //去除前后空格
                .omitEmptyStrings() //用于去除为空格的分割结果
                .split(str); //要分割的字符串
        System.out.println("--start--");
        for (String s : result) {
            System.out.println(s);
        }
        System.out.println("--end--");
    }


使用Splitter方法把string转换为list

public void createListFromString() {
    String input = "apple - banana - orange";
    List<String> result = Splitter.on("-")
                          .trimResults()
                          .splitToList(input);
    for (String string : result) {
        System.out.println(string);
    }
}


其他方法:
trimResults(CharMatcher) 给定匹配器,移除结果字符串的匹配字符 
limit(int) 限制拆分出的字符串数量
 

MapJoinner和MapSplitter

对于MapJoinner和MapSplitter的最好案例就是url的param编码。

MapJoinner

题目:
生产一个查询(id: 123,name: green)的学生信息的url。

利用Guava的MapJoinner的代码如下:

Joiner.on("&").withKeyValueSeparator("=").join(ImmutableMap.of("id", "123", "name", "green"));


这里采用了on传入map item之间分隔符,以及withKeyValueSeparator传递map项key/value之间的分隔符。所以能够很简单的实现,不用我们在去实现一个的for循环代码。


利用Guava的MapSplitter的代码如下:

final Map<String, String> join = Splitter.on("&").withKeyValueSeparator("=").split("id=123&name=green");

这里同样利用on传入字符串的第一分隔符,withKeyValueSeparator传入项的分隔符,产生map的key/value项,其结果是一个{id=123, name=green}的Map对象。
 

猜你喜欢

转载自blog.csdn.net/xiao__jia__jia/article/details/87890932