[改进]简洁方便的参数拼接 Joiner

2016-08-19

咱们在日常开发中,经常会遇到要把一个数组转化成一个字符串的情况,简单粗暴的话肯定是直接上String的简单拼接

protected String argsToString(Object[] paramArray) {
   String budiler = "";
   for (Object o : paramArray) {
       budiler += o.toString();
       budiler += ", ";
   }
   return budiler;
}

Upgrade #1

自己写的话,一般会用一个StringBuilder,一个for循环搞定就像下面这样:

protected String argsToString(Object[] paramArray) {
   StringBuilder budiler = new StringBuilder();
   for (Object o : paramArray) {
       budiler.append(JSON.toJSONString(o));
       budiler.append(COMMA);
   }
   return budiler.toString();
}

Upgrade #2

上面的这种示例会存在一个问题,就是我们得到的结果的字符串末尾总会多一个分隔符

key=Tom, Jerry, HelloKitty,

这样使我们不得不很拙略地想要去把最后一个subString()一下。

protected String argsToString(Object[] paramArray) {
        StringBuilder budiler = new StringBuilder();
        for (Object o : paramArray) {
            budiler.append(o.toString());
            budiler.append(COMMA);
        }
        //拙略地去除最后的分隔符
        return budiler.substring(0,budiler.length()-COMMA.length());
    }

Upgrade #3

其实Google Guava里面已经有了一个Joiner组件很方便地帮我们拼接,用起来简直不要太简单。

import com.google.common.base.Joiner;

/**
 * 参数处理工具类
 * @author <a href="i@qiancheng.me">千橙</a>
 */
public class Util {
     /** separator */
    private static final String COMMA = ", ";

     /** 把对象数组拼接成字符串 */
    public static String argsToString(Object[] paramArray) {
        return Joiner.on(COMMA).
                useForNull("null"). // NPE 替换为 字符串 null
                join(new StringBuilder(),paramArray).
                toString();
    }
}

最为感人的是,这个Joiner不仅支持对象数组,还有对集合类的支持重载方法。源码如下:

public <A extends Appendable> A appendTo(A appendable, Iterator<?> parts) throws IOException {
  checkNotNull(appendable);
  if (parts.hasNext()) {
    appendable.append(toString(parts.next()));
    while (parts.hasNext()) {
      appendable.append(separator);
      appendable.append(toString(parts.next()));
    }
  }
  return appendable;
}

看了源码让人感动得泪流满面的是Guava还有一个MapJoiner来实现键值对的字符串拼接,妈妈再也不用担心我手动拼接Map的字符串啦!

Code with JDK8

 /** 把对象数组拼接成字符串 */
    public static String argsToString(Object[] paramArray) {
        StringJoiner joiner = new StringJoiner(COMMA);
        for (Object o : paramArray) {
            joiner.add(o.toString());
        }
        return joiner.toString();
    }

我还是觉得 Google Guava 的方案最简洁。

天下大事,合(Joiner)久必分(Splitter)。更加感人的组件Splitter 以及对于URL处理的一些工具我们下次再见。

Reference

Guava 是个风火轮之基础工具
http://www.diguage.com/archives/143.html
https://google.github.io/guava/releases/snapshot/api/docs/com/google/common/base/Splitter.html

Comments
Write a Comment