资讯详情

资讯详情

我司为什么要用 Google 的Java规范?

阿里巴巴出了一本 Java 规范在国内 Java 开发眼里被赋予了神圣的殿堂但是我司禁止使用阿里巴巴的开发手册。目前 Google Guava 在实际应用中非常广泛本篇博客将以博主对 Guava 使用的认识以及在项目中的经验来给大家分享正如标题所言学习使用 Google Guava 可以让你快乐编程写出优雅的 JAVA 代码以面向对象思想处理字符串: Joiner/Splitter/CharMatcher“JDK 提供的 String 还不够好么也许还不够友好至少让我们用起来还不够爽还得操心举个栗子比如 String 提供的 split 方法我们得关心空字符串吧还得考虑返回的结果中存在 null 元素吧只提供了前后 trim 的方法如果我想对中间元素进行 trim 呢。那么看下面的代码示例guava 让你不必在操心这些Joiner/Splitter“Joiner 是连接器Splitter 是分割器通常我们会把它们定义为 static final利用 on 生成对象后在应用到 String 进行处理这是可以复用的。要知道 apache commons StringUtils 提供的都是 static method。更加重要的是guava 提供的 Joiner/Splitter 是经过充分测试它的稳定性和效率要比 apache 高出不少这个你可以自行测试下~发现没有我们想对 String 做什么操作就是生成自己定制化的 Joiner/Splitter多么直白简单流畅的 API对于 Joiner常用的方法是 跳过 NULL 元素skipNulls() / 对于 NULL 元素使用其他替代useForNull(String)对于 Splitter常用的方法是trimResults()/omitEmptyStrings()。注意拆分的方式有字符串还有正则还有固定长度分割太贴心了其实除了 Joiner/Splitter 外guava 还提供了字符串匹配器CharMatcherCharMatcher“CharMatcher将字符的匹配和处理解耦并提供丰富的方法供你使用对基本类型进行支持“guava 对 JDK 提供的原生类型操作进行了扩展使得功能更加强大Ints“guava 提供了 Bytes/Shorts/Ints/Iongs/Floats/Doubles/Chars/Booleans 这些基本数据类型的扩展支持只有你想不到的没有它没有的对 JDK 集合的有效补充灰色地带: Multiset“JDK 的集合提供了有序且可以重复的 List无序且不可以重复的 Set。那这里其实对于集合涉及到了 2 个概念一个 order一个 dups。那么 List vs Setand then some ?Multiset“Multiset 是什么我想上面的图你应该了解它的概念了。Multiset 就是无序的但是可以重复的集合它就是游离在 List/Set 之间的灰色地带至于有序的不允许重复的集合嘛guava 还没有提供当然在未来应该会提供 UniqueList我猜的哈哈来看一个 Multiset 的示例Multiset Code“Multiset 自带一个有用的功能就是可以跟踪每个对象的数量。Immutable vs unmodifiable来我们先看一个 unmodifiable 的例子unmodifiable“你看到 JDK 提供的 unmodifiable 的缺陷了吗实际上Collections.unmodifiableXxx 所返回的集合和源集合是同一个对象只不过可以对集合做出改变的 API 都被 override会抛出 UnsupportedOperationException。也即是说我们改变源集合导致不可变视图unmodifiable View也会发生变化oh my god!当然在不使用 guava 的情况下我们是怎么避免上面的问题的呢defensive copies“上面揭示了一个概念Defensive Copies保护性拷贝。OKunmodifiable 看上去没有问题呢但是 guava 依然觉得可以改进于是提出了 Immutable 的概念来看Immutable“就一个 copyOf你不会忘记如此 cheap~用 Google 官方的说法是were using just one class,just say exactly what we mean很了不起吗不仅仅是个概念Immutable 在 COPY 阶段还考虑了线程的并发性等很智能的O(∩_∩)O 哈哈~guava 提供了很多 Immutable 集合比如 ImmutableList/ImmutableSet/ImmutableSortedSet/ImmutableMap/......看一个 ImmutableMap 的例子ImmutableMap可不可以一对多Multimap“JDK 提供给我们的 Map 是一个键一个值一对一的那么在实际开发中显然存在一个 KEY 多个 VALUE 的情况比如一个分类下的书本我们往往这样表达MapK,List好像有点臃肿臃肿也就算了更加不爽的事我们还得判断 KEY 是否存在来决定是否 new 一个 LIST 出来有点麻烦更加麻烦的事情还在后头比如遍历比如删除so hard......来看 guava 如何替你解决这个大麻烦的Multimap“友情提示下guava 所有的集合都有 create 方法这样的好处在于简单而且我们不必再重复泛型信息了。get()/keys()/keySet()/values()/entries()/asMap() 都是非常有用的返回 view collection 的方法。Multimap 的实现类有ArrayListMultimap/HashMultimap/LinkedHashMultimap/TreeMultimap/ImmutableMultimap/......可不可以双向BiMap“JDK 提供的 MAP 让我们可以 find value by key那么能不能通过 find key by value 呢能不能 KEY 和 VALUE 都是唯一的呢。这是一个双向的概念即 forwardbackward。在实际场景中有这样的需求吗比如通过用户 ID 找到 mail也需要通过 mail 找回用户名。没有 guava 的时候我们需要 create forward map AND create backward mapand now just let guava do that for you.BiMap“biMap / biMap.inverse() / biMap.inverse().inverse() 它们是什么关系呢你可以稍微看一下 BiMap 的源码实现实际上当你创建 BiMap 的时候在内部维护了 2 个 map一个 forward map一个 backward map并且设置了它们之间的关系。因此biMap.inverse() ! biMap biMap.inverse().inverse() biMap可不可以多个 KEYTable“我们知道数据库除了主键外还提供了复合索引而且实际中这样的多级关系查找也是比较多的当然我们可以利用嵌套的 Map 来实现MapK1,MapK2,V2。为了让我们的代码看起来不那么丑陋guava 为我们提供了 Table。Table“Table 涉及到 3 个概念rowKey,columnKey,value并提供了多种视图以及操作方法让你更加轻松的处理多个 KEY 的场景。函数式编程FunctionsFunctions“上面的代码是为了完成将 List 集合中的元素先截取 5 个长度然后转成大写。函数式编程的好处在于在集合遍历操作中提供自定义 Function 的操作比如 transform 转换。我们再也不需要一遍遍的遍历集合显著的简化了代码对集合的transform操作可以通过Function完成断言PredicatePredicate“Predicate 最常用的功能就是运用在集合的过滤当中filter“需要注意的是 Lists 并没有提供 filter 方法不过你可以使用 Collections2.filter 完成check null and otherOptional、Preconditions在 guava 中对于 null 的处理手段是快速失败你可以看看 guava 的源码很多方法的第一行就是Preconditions.checkNotNull(elements);要知道 null 是模糊的概念是成功呢还是失败呢还是别的什么含义呢Preconditions/OptionalCache is king“对于大多数互联网项目而言缓存的重要性不言而喻如果我们的应用系统并不想使用一些第三方缓存组件如 redis我们仅仅想在本地有一个功能足够强大的缓存很可惜 JDK 提供的那些 SET/MAP 还不行CacheLoader“首先这是一个本地缓存guava 提供的 cache 是一个简洁、高效易于维护的。为什么这么说呢因为并没有一个单独的线程用于刷新 OR 清理 cache对于 cache 的操作都是通过访问/读写带来的也就是说在读写中完成缓存的刷新操作其次我们看到了我们非常通俗的告诉 cache我们的缓存策略是什么SO EASY在如此简单的背后是 guava 帮助我们做了很多事情比如线程安全。让异步回调更加简单“JDK 中提供了 Future/FutureTask/Callable 来对异步回调进行支持但是还是看上去挺复杂的能不能更加简单呢比如注册一个监听回调。异步回调“我们可以通过 guava 对 JDK 提供的线程池进行装饰让其具有异步回调监听功能然后在设置监听器即可Summary到这里这篇文章也只介绍了 guava 的冰山一角其实还有很多内容guava package“比如反射、注解、网络、并发、IO 等等好了希望这篇文章让你快速进阶快乐编程
觉得有用,分享给同行:

为您的企业打造数字门面

稳重轻奢商务风格,端正雅致视觉,长效耐看不易过时。

立即咨询 →