当前位置: 首页 > 科技观察

为什么强烈推荐Java程序员使用GoogleGuava编程

时间:2023-03-18 16:12:40 科技观察

GoogleGuava目前在实际应用中被广泛使用。本篇博客将博主对Guava使用的理解和在项目中的经验分享给大家!学会使用GoogleGuava,可以让你快乐编程,写出优雅的JAVA代码!用面向对象的思想处理字符串:Joiner/Splitter/CharMatcherJDK提供的String还不够好吗?可能还不够友好,至少对我们用起来还不够爽,我们还得操心!比如String提供的split方法,我们要关心空字符串,要考虑返回结果中是否存在null元素。我们只提供前后修剪的方法(如果我想修剪中间的元素)。那么,看下面的代码示例,guava让你不用担心这些:Joiner/SplitterJoiner是连接器,Splitter是拆分器,通常我们会将它们定义为staticfinal,使用on来生成对象并应用于String用于处理,这是可重复使用的。你必须知道ApachecommonsStringUtils提供了静态方法。更重要的是,guava提供的Joiner/Splitter已经过全面测试。其稳定性和效率都比apache高很多。这个你可以自己测试一下~我发现没有我们想对String做的操作,只是自己生成CustomizedJoiner/Splitter,多么直白、简单、流畅的API!对于Joiner,常用的方法是跳过NULL元素:skipNulls()/对NULL元素使用其他替代方法:useForNull(String)对于Splitter,常用的方法是:trimResults()/omitEmptyStrings()。注意拆分的方式,有字符串、正则模式、定长拆分(好贴心!)其实guava除了Joiner/Splitter之外,还提供了一个字符串匹配器:CharMatcherCharMatcherCharMatcher,解决匹配处理字符耦合,并提供丰富的方法供你使用!基本类型支持Guava扩展了JDK提供的原生类型操作,功能更加强大!Intsguava提供了对Bytes/Shorts/Ints/Iongs/Floats/Doubles/Chars/Booleans等基本数据类型的扩展支持,只有你想不到,没有它没有!JDK集合的有效补充灰色区域:MultisetJDK集合提供有序且可重复的List以及无序且不可重复的Set。其实这里的集合涉及到两个概念,一个order和一个dups。那么List与Set,然后是一些?什么是MultisetMultiset,我觉得上图,大家应该明白它的概念了。Multiset是一个无序但可重复的集合,它是List/Set之间的“灰色地带”!(至于不允许重复的有序集合,guava暂时还没有提供,当然以后应该会提供UniqueList吧,我猜,哈哈)我们来看一个Multiset的例子:MultisetCodeMultiset自带了一个很好用的函数,就是可以跟踪每个对象的数量。Immutablevsunmodifiable先来看一个unmodifiable的例子:unmodifiable你见过JDK提供的unmodifiable的缺陷吗?实际上,Collections.unmodifiableXxx返回的集合与源集合是同一个对象,只是可以对集合进行更改的API都被覆盖了,会抛出UnsupportedOperationException。也就是说,如果我们改变源集合,那么不可变视图(unmodifiableView)也会改变,天哪!当然,如果不使用guava,我们如何避免上述问题呢?Defensivecopies揭示了上面的一个概念:DefensiveCopies,保护性副本。OK,unmodifiable好像没问题,但是guava还是觉得可以改进,所以提出了Immutable的概念,看:Immutable只是一个copyOf,你不会忘记的,好便宜~用Google官方的说法:we're只用一个类,直接说出我们的意思,是不是很神奇(不只是概念,Immutable在COPY阶段也考虑了线程的并发,很聪明!),O(∩_∩)O哈哈~提供byguava有很多Immutable集合,比如ImmutableList/ImmutableSet/ImmutableSortedSet/ImmutableMap/...看一个ImmutableMap的例子:ImmutableMap可以一对多吗:MultimapJDK提供的Map是一个键,一个值,和one-to-one,那么在实际开发中,明明有一个KEY有多个VALUE(比如一个类别下的一本书),我们经常这样表达:Map>,好像有点臃肿!臃肿还好,更烦的是我们还要判断KEY是否存在来决定是否新建LIST,有点麻烦!更麻烦的事情还在后头,比如遍历,比如删除,好难。。。看看guava是怎么为你解决这个大麻烦的:Multimap的友情提示,guava中所有的集合都有create方法,这样的好处就是简单,我们不必重复通用信息。get()/keys()/keySet()/values()/entries()/asMap()是返回视图集合的非常有用的方法。Multimap的实现类有:ArrayListMultimap/HashMultimap/LinkedHashMultimap/TreeMultimap/ImmutableMultimap/...可不可以是双向的:BiMapJDK提供的MAP可以让我们通过key来查找value,那么我们是否可以通过value来查找key呢?KEY和VALUE都是唯一的。这是一个双向的概念,即前向+后向。实际场景中有这样的需求吗?例如,如果通过用户ID查找邮件,则还需要通过邮件检索用户名。当没有guava的时候,我们需要创建forwardmapANDcreatebackwardmap,现在就让guava帮你做吧。BiMapbiMap/biMap.inverse()/biMap.inverse().inverse()它们之间的关系是什么?可以看看BiMap的源码实现。其实你在创建BiMap的时候,内部维护了两张图,一张前向图和一张后向图,并且设置了它们之间的关系。因此,biMap.inverse()!=biMap;biMap.inverse().inverse()==biMap可以有多个KEY:Table我们知道,除了主键之外,数据库还提供了复合索引,而在实践中这样的多级关系搜索也有很多.当然我们可以使用嵌套的Maps来实现:Map>。为了让我们的代码看起来不那么难看,guava为我们提供了Table。TableTable涉及到三个概念:rowKey、columnKey、value,并提供了多种视图和操作方式,方便您处理多KEY场景。函数式编程:FunctionsFunctions上面的代码是完成List集合中的元素,先截取5个长度,然后转为大写。函数式编程的好处是在集合遍历操作中提供自定义的Function操作,比如transform转换。我们不再需要一遍又一遍地遍历集合,大大简化了代码!对集合的transform操作可以通过Function来断言:PredicatePredicate最常用的功能就是用在集合的过滤上!filter需要注意的是Lists并没有提供filter方法,但是可以使用Collections2.filter来完成!checknullandother:Optional,Preconditions在guava中,对null的处理方式是fastfailure。可以看看guava的源码。许多方法的第一行是:Preconditions.checkNotNull(elements);你要知道null是有歧义的概念,是成功,还是失败,还是别的?Preconditions/OptionalCache为王对于大多数互联网项目来说,缓存的重要性不言而喻!如果我们的应用系统不想使用一些第三方的缓存组件(比如redis),我们只是希望本地有一个足够强大的缓存。可惜JDK提供的SET/MAP还不够用!CacheLoader首先,这是一个本地缓存。guava提供的缓存简洁、高效、易于维护。你为什么这么说?因为没有单独的线程刷新OR清除缓存,所以缓存操作都是通过访问/读写带来的,也就是说缓存刷新操作是在读写的过程中完成的!其次,我们已经看到我们以一种非常简单的方式告诉缓存,我们的缓存策略是什么,SOEASY!这么简单的背后,guava帮我们做了很多事情,比如线程安全。让异步回调更简单JDK提供了Future/FutureTask/Callable来支持异步回调,但是看起来还是很复杂,能再简单点吗?例如,注册一个监听回调。异步回调我们可以通过guava对JDK提供的线程池进行装饰,让它具备异步回调监听功能,然后设置监听器!