• 基础工具类Joiner的使用


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

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

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

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

    4. 其他类:针对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(")");
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

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

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

    补充:

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

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

      Joiner.on(",").skipNulls().join(spuIdList);
      Joiner.on(",").useForNull("#").join(spuIdList);
      
      • 1
      • 2
    • 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);//水浒传:李逵 红楼梦:刘姥姥 三国演义:关羽 西游记:猪八戒
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    三、常用API总结:

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

    比较常见的实现类: BufferedWriter, CharArrayWriter, CharBuffer, FileWriter, FilterWriter, LogStream, OutputStreamWriter, 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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    Join+on
    // 将可迭代的参数中所有子元素连接。
    String join(Iterable<?> parts)
    // 为static对象设置分隔符
    static Joiner on(char separator)
    
    • 1
    • 2
    • 3
    • 4

    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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

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

    其他
    Joiner skipNulls()
    Joiner useForNull(String nullText)
    Joiner.MapJoiner withKeyValueSeparator(String keyValueSeparator)
    
    • 1
    • 2
    • 3

    最后

    大家有兴趣的可以去了解下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

  • 相关阅读:
    java switch判断语句
    在 Transformers 中使用对比搜索生成可媲美人类水平的文本 🤗
    SpringBoot整合MybatisPlus
    软件测试 —— 移动端测试
    yolov7模型训练环境安装
    Kafka SASL认证授权(六)全方位性能测试
    最新版手机软件App下载排行网站源码/App应用商店源码
    Linux 创建的用户无法登录
    基于JavaSwing开发网络五子棋游戏(客户端+服务器 聊天 下棋) 课程设计 大作业
    ​软考-高级-信息系统项目管理师教程 第四版【第19章-配置与变更管理-思维导图】​
  • 原文地址:https://blog.csdn.net/LXYDSF/article/details/128011305