返回顶部
首页 > 资讯 > 精选 >Java效率提升神器之Guava-Joiner怎么使用
  • 470
分享到

Java效率提升神器之Guava-Joiner怎么使用

2023-07-02 16:07:17 470人浏览 八月长安
摘要

今天小编给大家分享一下Java效率提升神器之Guava-Joiner怎么使用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。J

今天小编给大家分享一下Java效率提升神器之Guava-Joiner怎么使用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。

Joiner

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

ArrayList<String> conditions = new ArrayList<String>();conditions.add("condition1");conditions.add("condition2");conditions.add("condition3");private String buildCondition(ArrayList<String> conditions) {    StringBuilder sb = new StringBuilder();    for (String condition : conditions) {        sb.append(condition);        sb.append(" or ");    }    int index = sb.lastIndexOf(" or ");    return index > 0 ? sb.substring(0, index) : sb.toString();}  // condition1 or condition2 or condition3

基本上会手写循环去实现,代码瞬间变得丑陋起来。并且循环完了还得删除最后一个多余的or。

使用Guava工具,我们能够轻而易举的完成字符串拼接这一简单任务。借助 Joiner 类,代码瞬间变得优雅起来。

Joiner.on(" or ").join(conditions);

被拼接的对象集,可以是硬编码的少数几个对象,可以是实现了 Iterable 接口的集合,也可以是迭代器对象。

除了返回一个拼接过的字符串,Joiner 还可以在实现了 Appendable 接口的对象所维护的内容的末尾,追加字符串拼接的结果。

StringBuilder sb = new StringBuilder("result:");Joiner.on("#").appendTo(sb, 1, 2, 3);System.out.println(sb);     //result:1#2#3

我们看下面这个例子:

Joiner.on("#").join(1, null, 3)

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

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

Joiner.on("#").skipNulls().join(1, null, 3);      //1#3Joiner.on("#").useForNull("").join(1, null, 3);   //1##3

Joiner.MapJoiner

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

 Map<Integer, Integer> test = new HashMap<Integer, Integer>(); test.put(1, 2); test.put(3, 4); Joiner.on("#").withKeyValueSeparator("=").join(test); //1=2#3=4

withKeyValueSeparator 方法指定了键与值的分隔符,同时返回一个 MapJoiner 实例。

Joiner.on("#").withKeyValueSeparator("=").join(ImmutableMap.of(1, 2, 3, 4));  //1=2#3=4

源代码分析

源码来自Guava 18.0。Joiner类的源码一共458行。大部分都是注释。 Joiner 只能通过 Joiner.on 函数来初始化,它的构造方法是私有的。

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

整个 Joiner 类最核心的函数莫过于 <A extends Appendable> appendTo(A, Iterator<?>),一切的字符串拼接操作,最后都会调用到这个函数。这就是所谓的全功能函数,其他的一切 appendTo 只不过是它的重载,一切的join不过是它和它的重载的封装。

  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;  }

这段代码的第一个技巧是使用 if 和 while 来实现了比较优雅的分隔符拼接,避免了在末尾插入分隔符的尴尬;第二个技巧是使用了自定义的 toString 方法而不是 Object#toString 来将对象序列化成字符串,为后续的各种空指针保护开了方便之门。

来看一个比较有意思的 appendTo 重载。

public final StringBuilder appendTo(StringBuilder builder, Iterator<?> parts) {    try {        this.appendTo((Appendable)builder, (Iterator)parts);        return builder;    } catch (IOException var4) {        throw new AssertionError(var4);    }}

在 Appendable 接口中,append 方法是会抛出 IOException 的。然而 StringBuilder 虽然实现了 Appendable,但是它覆盖实现的 append 方法却是不抛出 IOException 的。于是就出现了明知不可能抛异常,却又不得不去捕获异常的尴尬。

这里的异常处理手法十分机智,异常变量命名为 impossible,我们一看就明白这里是不会抛出 IOException 的。但是如果 catch 块里面什么都不做又好像不合适,于是抛出一个 AssertionError,表示对于这里不抛异常的断言失败了。

另一个比较有意思的 appendTo 重载是关于可变长参数。

public final <A extends Appendable> A appendTo(A appendable, @Nullable Object first, @Nullable Object second, Object... rest) throws IOException {    return this.appendTo((Appendable)appendable, (Iterable)iterable(first, second, rest));}

注意到这里的 iterable 方法,它把两个变量和一个数组变成了一个实现了Iterable 接口的集合,非常精妙的实现!

private static Iterable<Object> iterable(final Object first, final Object second, final Object[] rest) {    Preconditions.checkNotNull(rest);    return new AbstractList() {        public int size() {            return rest.length + 2;        }        public Object get(int index) {            switch(index) {            case 0:                return first;            case 1:                return second;            default:                return rest[index - 2];            }        }    };}

要想看明白这段代码,需要熟悉AbstractList类中迭代器的实现。迭代器内部维护着一个游标,cursor。迭代器的两大关键操作,hasNext 判断是否还有没遍历的元素,next 获取下一个元素,它们的实现是这样的。

public boolean hasNext() {        return cursor != size();}public E next() {        checkForComodification();    try {    E next = get(cursor);    lastRet = cursor++;    return next;    } catch (IndexOutOfBoundsException e) {    checkForComodification();    throw new NoSuchElementException();    }}

hasNext 中关键的函数调用是size方法,获取集合的大小。next 方法中关键的函数调用是get方法,获取第 i 个元素。Guava 的实现返回了一个被覆盖了 size 和 get 方法的 AbstractList,巧妙的复用了由编译器生成的数组,避免了新建列表和增加元素的开销。

拼接Map键值对

MapJoiner 实现为 Joiner 的一个静态内部类,它的构造函数和 Joiner 一样也是私有,只能通过 withKeyValueSeparator来生成实例。类似地,MapJoiner 也实现了 appendTo 方法和一系列的重载,还用 join 方法对 appendTo 做了封装。

MapJoiner 整个实现和 Joiner 大同小异,在实现中大量使用 Joiner 的 toString 方法来保证空指针保护行为和初始化时的语义一致。

以上就是“Java效率提升神器之Guava-Joiner怎么使用”这篇文章的所有内容,感谢各位的阅读!相信大家阅读完这篇文章都有很大的收获,小编每天都会为大家更新不同的知识,如果还想学习更多的知识,请关注编程网精选频道。

--结束END--

本文标题: Java效率提升神器之Guava-Joiner怎么使用

本文链接: https://lsjlt.com/news/342887.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Java效率提升神器之Guava-Joiner
    目录JoinerJoiner.MapJoiner源代码分析拼接Map键值对姊妹篇:Java效率提升神器jOOR 在我们的开发中经常会用到Guava中的一些功能。但是我们所使用到的只是...
    99+
    2024-04-02
  • Java效率提升神器之Guava-Joiner怎么使用
    今天小编给大家分享一下Java效率提升神器之Guava-Joiner怎么使用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。J...
    99+
    2023-07-02
  • Java效率提升神器jOOR怎么使用
    今天小编给大家分享一下Java效率提升神器jOOR怎么使用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。Java中的原生反射...
    99+
    2023-07-02
  • Java效率提升神器jOOR
    目录前言jOOR特点常用API测试测试APIS代理功能jOOR实现方式动态编译结论前言 Java中的原生反射库虽然方法不多,但写起来却非常繁琐, 比如: public static ...
    99+
    2024-04-02
  • 怎么用Java工具类提升编码效率
    这篇文章主要介绍“怎么用Java工具类提升编码效率”,在日常操作中,相信很多人在怎么用Java工具类提升编码效率问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么用Java工具类提升编码效率”的疑惑有所帮助!...
    99+
    2023-06-15
  • 提升java开发效率工具lombok使用争议
    目录引言什么是 lombok如何使用lombok 的原理和滥用引言 对使用 lombok 还是有很多争议的,有些公司不建议使用,有些公司又大量使用。 我们的想法是:可以使用,但是不...
    99+
    2024-04-02
  • 怎么使用RelProxy提高Java开发效率
    本篇内容介绍了“怎么使用RelProxy提高Java开发效率”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!RelProxy 旨在通过下列两种...
    99+
    2023-06-17
  • 自从在 IDEA 中用了热部署神器 JRebel 之后,开发效率提升了 10(真棒)
    来源:https://github.com/judasn/IntelliJ-IDEA-Tutorial/blob/master/jrebel-setup.md 在 Java Web ...
    99+
    2024-04-02
  • 使用 VSCode 编辑器提升代码质量和效率
    在当今的软件开发行业中,编写高质量且高效率的代码是非常重要的。而作为程序员们日常使用最多的编辑器之一,VSCode(Visual Studio Code)不仅提供了强大的功能,还可以帮...
    99+
    2024-04-02
  • 怎么提升服务器的使用效果
    提升服务器使用效果的方法:1、解决系统过热问题,机房采用专用的精密空调,配备保障电源等;2、解决系统宕机问题,建立自身的灾备中心,对关键设备进行N x冗余备份等;3、注重整体的绿色节能问题,满足IT环境的基本运营,同时确保可扩展性;4、关注...
    99+
    2024-04-02
  • 网站美国服务器租用怎么提升工作效率
    网站美国服务器租用提升工作效率的方法:1、将美国服务器进行虚拟化,从而充分利用美国服务器配置资源;2、运用管理工具来管理操控美国服务器,从而使机房维护人员高效排查服务器问题并及时解决;3、投资最新技术,升级美国服务器的配置,从而提高服务器整...
    99+
    2024-04-02
  • 怎么使用redis提高缓存效率
    以下是一些使用Redis提高缓存效率的方法:1. 设置合适的过期时间:在将数据存储到Redis缓存中时,可以为每个数据设置一个过期时...
    99+
    2023-09-05
    redis
  • 怎么使用ABAP提高工作效率
    本篇内容主要讲解“怎么使用ABAP提高工作效率”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么使用ABAP提高工作效率”吧!(1) 直接批量生成数据到ABAP内表里:* 2017-05-14 ...
    99+
    2023-06-04
  • 提高效率的Vue指令怎么使用
    这篇文章主要介绍“提高效率的Vue指令怎么使用”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“提高效率的Vue指令怎么使用”文章能帮助大家解决问题。v-model相信大家对v-model并不陌生,简单...
    99+
    2023-07-05
  • 如何使用Java MyBatis拦截器提高工作效率
    小编给大家分享一下如何使用Java MyBatis拦截器提高工作效率,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!场景:在后端服务开发时,现在很流行的框...
    99+
    2023-06-29
  • 怎么在Linux系统中使用zsh提高效率
    怎么在Linux系统中使用zsh提高效率?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。1、主题和插件多年来,开源社区已经为 zsh 开发了数不清的主题和插件。主题是一个预定义提...
    99+
    2023-06-09
  • 怎么使用numpy提高Python数据分析效率
    今天小编给大家分享一下怎么使用numpy提高Python数据分析效率的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。1、数组初...
    99+
    2023-07-06
  • Android开发效率提升利器-ButterKnife最全使用详解及ButterKnife插件的使用
    本文目录ButterKnife 概述使用前准备添加依赖ButterKnife绑定Activity绑定Fragment绑定RecyclerView...
    99+
    2022-06-06
    butterknife android开发 效率 Android
  • Java中怎么利用Serverless提高微服务治理效率
    Java中怎么利用Serverless提高微服务治理效率,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。微服务治理面临的挑战在业务初期,因人手有限,想要快速开发并...
    99+
    2023-06-15
  • 怎么使用Tmux提高终端环境下的效率
    这篇文章主要介绍“怎么使用Tmux提高终端环境下的效率”,在日常操作中,相信很多人在怎么使用Tmux提高终端环境下的效率问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么使用Tmux提高终端环境下的效率”的疑...
    99+
    2023-06-16
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作