Guava学习笔记:Google Guava 类库简介

2019-03-08 11:41|来源: 网络

  Guava 是一个 Google 的基于java1.6的类库集合的扩展项目,包括 collections, caching, primitives support, concurrency libraries, common annotations, string processing, I/O, 等等. 这些高质量的 API 可以使你的JAVa代码更加优雅,更加简洁,让你工作更加轻松愉悦。下面我们就开启优雅Java编程学习之旅!

  项目相关信息:

  官方首页:http://code.google.com/p/guava-libraries
  官方下载:http://code.google.com/p/guava-libraries/downloads/list
  官方文档:http://docs.guava-libraries.googlecode.com/git/javadoc
                    http://www.ostools.net/apidocs/apidoc?api=guava

  源码包的简单说明:
  com.google.common.annotations:普通注解类型。
  com.google.common.base:基本工具类库和接口。
  com.google.common.cache:缓存工具包,非常简单易用且功能强大的JVM内缓存。
  com.google.common.collect:带泛型的集合接口扩展和实现,以及工具类,这里你会发现很多好玩的集合。
  com.google.common.eventbus:发布订阅风格的事件总线。
  com.google.common.hash: 哈希工具包。
  com.google.common.io:I/O工具包。
  com.google.common.math:原始算术类型和超大数的运算工具包。
  com.google.common.net:网络工具包。
  com.google.common.primitives:八种原始类型和无符号类型的静态工具包。
  com.google.common.reflect:反射工具包。
  com.google.common.util.concurrent:多线程工具包。

  类库使用手册:

  一.  基本工具类:让使用Java语言更令人愉悦。

  1. 使用和避免 null:null 有语言歧义, 会产生令人费解的错误, 反正他总是让人不爽。很多 Guava 的工具类在遇到 null 时会直接拒绝或出错,而不是默默地接受他们。
  2. 前提条件:更容易的对你的方法进行前提条件的测试。
  3. 常见的对象方法: 简化了Object常用方法的实现, 如 hashCode() 和 toString()。
  4. 排序: Guava 强大的 "fluent Comparator"比较器, 提供多关键字排序。
  5. Throwable类: 简化了异常检查和错误传播。

  二.  集合类:集合类库是 Guava 对 JDK 集合类的扩展, 这是 Guava 项目最完善和为人所知的部分。

  1. Immutable collections(不变的集合): 防御性编程, 不可修改的集合,并且提高了效率。
  2. New collection types(新集合类型):JDK collections 没有的一些集合类型,主要有:multisets,multimaps,tables, bidirectional maps等等
  3. Powerful collection utilities(强大的集合工具类): java.util.Collections 中未包含的常用操作工具类
  4. Extension utilities(扩展工具类): 给 Collection 对象添加一个装饰器? 实现迭代器? 我们可以更容易使用这些方法。

  三.  缓存: 本地缓存,可以很方便的操作缓存对象,并且支持各种缓存失效行为模式。

  四.  Functional idioms(函数式): 简洁, Guava实现了Java的函数式编程,可以显著简化代码。

  五. Concurrency(并发):强大,简单的抽象,让我们更容易实现简单正确的并发性代码。

  1. ListenableFuture(可监听的Future): Futures,用于异步完成的回调。
  2. Service: 控制事件的启动和关闭,为你管理复杂的状态逻辑。

  六. Strings: 一个非常非常有用的字符串工具类: 提供 splitting,joining, padding 等操作。

  七. Primitives: 扩展 JDK 中未提供的对原生类型(如int、char等)的操作, 包括某些类型的无符号的变量。

  八. Ranges: Guava 一个强大的 API,提供 Comparable 类型的范围处理, 包括连续和离散的情况。

  九. I/O: 简化 I/O 操作, 特别是对 I/O 流和文件的操作, for Java 5 and 6.

  十. Hashing: 提供比 Object.hashCode() 更复杂的 hash 方法, 提供 Bloom filters.

  十一. EventBus: 基于发布-订阅模式的组件通信,但是不需要明确地注册在委托对象中。

  十二. Math: 优化的 math 工具类,经过完整测试。

  十三. Reflection: Guava 的 Java 反射机制工具类。

   

 

 

相关问答

更多

为什么Guava不为小的ImmutableLists使用专门的类?(Why does Guava not use specialized classes for small ImmutableLists?)

你能帮我理解这里涉及的权衡吗? 这是一个权衡: 性能 - 不分配临时数组可以节省成本。 但是,人们需要进行一些广泛的代码分析和基准测试来量化这种节省。 (我怀疑在大多数应用程序中它都是微不足道的。请阅读@Voo提供的这个链接 !) 可读性 - 拥有一堆额外的重载会使javadoc混乱。 可维护性 - 有一堆重载是以不需要临时对象的方式实现的,这需要大量的复制/粘贴编程,这使得将来的代码维护更加困难。 实用程序 - 这些重载的使用频率是多少? 我希望答案“很少”。 字节码占用空间 - 这些额外的重载 ...

使用Google Guava库进行Android开发是一个好主意吗?(Is it a good idea to use Google Guava library for Android development?)

(太大的评论,所以我发布答案。)个人我使用整个番石榴库在每个Java项目,当我没有重大和适当的性能问题。 例如,如果您有Android环境中的内存问题,则可以使用ProGuard仅获取真正需要的番石榴部分。 而且, 有许多使用Guava的Android应用程序 - 不仅仅是Google的直接Google搜索和Youtube。 (您还应该看到兼容性说明 。) (Too big for comment, so I post an answer.) Personally I use whole Guav ...

Google Guava库的junit测试在哪里?(Where are the junit tests for Google Guava libraries?)

它们位于源代码树中 ,您可以使用Subversion 查看 。 They're in the source tree which you can check out with Subversion.

是否有可能将Guava的ForwardingListIterator和PeekingIterator结合起来?(Is it possible to combine Guava's ForwardingListIterator with a PeekingIterator?)

将一个新的“窥视”概念引入到一个已经很容易在两个方向上滚动的迭代器的价值在哪里? 如果你真的想要它,你可以实现两个简单的静态助手: public static <T> T peekNext(ListIterator<T> iterator) { T next = iterator.next(); iterator.previous(); return next; } public static <T> T peekPrevious(ListIterator<T> iterator) ...

Guava ValueGraph的简单示例(Simple example of Guava ValueGraph)

Guava wiki提供了以下使用ValueGraph示例: MutableValueGraph<Integer, Double> weightedGraph = ValueGraphBuilder.directed().build(); weightedGraph.addNode(1); weightedGraph.putEdgeValue(2, 3, 1.5); // also adds nodes 2 and 3 if not already present weightedGraph.p ...

不兼容的库版本selenium / guava(Incompatible library version selenium / guava)

因为你对com.google.guava:guava:23.3 org.seleniumhq.selenium:selenium-java:3.0.1依赖性com.google.guava:guava:23.3使用org.seleniumhq.selenium:selenium-java:3.0.1可能会让你在十字路口。 但是Selenium发行说明清楚地提到了以下番石榴依赖性: Selenium v2.49.0 :Bump guava到19版 Selenium v3.1.0 :需要更新最新的番石 ...

检测使用哪种Guava版本?(Detect which Guava version is used? [duplicate])

您可以从guava.jar中的META-INF /下的文件中获取版本字符串。 在运行时,您需要使用适当的ClassLoader实例来加载所需的META-INF /文件。 您可以使用Guava的Resources实用程序类直接加载具有唯一名称的资源,也可以使用$someGuavaClassName.class.getClassLoader().getResources(String)在多个jar文件中遍历具有相同名称的资源。 如果你使用后者,那么你将需要使用someGuavaClassName将在你 ...

如何正确使用guava Closer(How to use guava Closer properly)

从番石榴自己的解释来看,你必须使用Throwable ,是的。 这是他们的示例代码段: public void foo() throws IOException { Closer closer = Closer.create(); try { InputStream in = closer.register(openInputStream()); OutputStream out = closer.register(openOutputStream()); // d ...

使用guava AbstractScheduledService(Using guava AbstractScheduledService)

AbstractScheduledServiced实现Service 。 Service接口描述了生命周期方法,包括startAsync 。 ServiceState枚举文字包含有关其含义的文档。 处于NEW状态的服务(刚刚创建): 处于此状态的服务处于非活动状态。 它做的工作量极少,占用资源极少。 要使服务执行某些有用的操作,您必须将其转换为RUNNING状态 此状态下的服务正在运行。 这就是为什么你必须在它做任何事之前启动服务的原因。 我还建议不要从构造函数中调用startAsync,而是从创 ...

如何生成HashCode以调用Hashing #contactHash of google / guava?(How to generate HashCode in order to call Hashing#consistentHash of google/guava?)

使用另一个HashFunction来散列行和列,例如 HashCode h = Hashing.murmur3_32().newHasher() .putString(row.getString(), StandardCharsets.UTF_8) .putString(col.getString(), StandardCharsets.UTF_8) .hash() Use another HashFunction to hash the row and column, e.g. H ...