【问题标题】:The Guava library: What are its most useful and/or hidden features? [closed]Guava 库:它最有用和/或隐藏的功能是什么? [关闭]
【发布时间】:2011-04-15 03:19:12
【问题描述】:

我快速浏览了Guava API 和它提供的新集合类型(例如MultimapBiMap 似乎很有用),我正在考虑将这个库包含在我工作的项目中开。

但是,如果库没有太大的好处并且学习这些功能会浪费宝贵的时间,我也不愿意将它们包括在内。

您是否将 Guava 库包含在您的项目中,并以任何意想不到的方式证明它很有用?你以后会一直使用它吗?它的主要好处/节省时间是什么?它的隐藏功能是什么?

【问题讨论】:

  • 你的标题和你的问题真的不匹配。
  • “新的馆藏类型......看起来很有用”和“我不愿包括图书馆......如果它们没有太大的好处” - 那么它是什么?你要么认为图书馆有用并且有好处,要么你不认为
  • 截至 2017 年(问题现已结束),如果您使用的是最新的 Gradle (4.4.1),则默认将 guava 21.0 作为依赖项添加到 build.gradle 中,并带有“此依赖项是内部使用,而不是在他们自己的编译类路径上暴露给消费者”,这表明 Gradle 团队已经决定那里有一些非常有价值的东西。

标签: java guava


【解决方案1】:

说真的,Guava 中的一切都是有用的。我已经使用它很长一段时间了,但我仍然总是发现我可以用它来做一些新的事情,而且我需要的代码比手工操作要少。

有些事情别人没有真正提到我喜欢:

  • Multimaps 很棒。任何时候您要使用 Map<Foo, Collection<Bar>> 之类的东西时,请改用 multimap,这样可以省去大量繁琐的检查映射到键的现有集合的工作,如果不存在则创建和添加它。
  • Ordering 非常适合构建符合您要求的 Comparators。
  • Maps.uniqueIndexMultimaps.index:这些方法采用 IterableFunction 并构建 ImmutableMapImmutableListMultimap,通过将函数应用于每个函数的结果索引 Iterable 中的值。因此,使用检索项目 ID 的函数,您可以在一行中按 ID 为项目列表编制索引。
  • 它提供的功能性东西...filtertransform 等。尽管为Functions 和Predicates 使用类很冗长,但我发现这很有用。我举了一个例子来说明如何让这本书很好读 here
  • ComparisonChain 是一个小而容易被忽略的类,当您想要编写一个比较方法来连续比较多个值并在找到第一个差异时应该返回时,它很有用。它消除了所有的乏味,使其只需几行链式方法调用。
  • Objects.equal(Object,Object) - null 安全等于。
  • Objects.hashCode(Object...) - 基于类的多个字段获取哈希码的简便方法。
  • Objects.firstNonNull(Object,Object) - 如果第一个值为空,则减少获取默认值的代码,特别是如果第一个值是方法调用的结果(在以正常方式执行此操作之前,您必须将其分配给变量)。
  • CharMatchers 已经提到过,但它们非常强大。
  • Throwables 让你可以用 throwable 做一些好事,例如 Throwables.propagate 如果它是 RuntimeExceptionError,它会重新抛出 throwable,并将其包装在 RuntimeException 中,否则会抛出。

我当然可以继续,但我必须开始工作。 =) 无论如何,尽管我在这里列出了一些我喜欢的东西,但事实上 Guava 中的所有东西在某些情况下都是有用的。其中大部分是非常有用的。当你使用它时,你会发现更多的用途。不使用它会感觉有点像一只手被绑在背后。

【讨论】:

  • 完全同意ComparisionChain
【解决方案2】:

几年来,我在 Google 内部一直有效地使用 Guava - 这太棒了。

特别喜欢的部分是:

  • Charsets.* - 如此简单,如此有用
  • 收藏
  • IO 处理(在一行中完全读取资源等)
  • Splitter/Joiner
  • Preconditions

【讨论】:

  • 请注意,我们现在在 Java 7+ 中有 StandardCharsets。我想知道有多少 Guava 的其他功能已经进入 Java。
  • 我发现了这个Modernizer Maven Plugin,它可以检测遗留 API 的使用,包括 Guava 等第三方库。 configuration file 似乎包含 67 个 Guava 弃用,包括 StandardCharsets。
【解决方案3】:

我最初将它用于集合速记。例如,而不是:

Map<String, Map<Long, List<String>>> map = new HashMap<String, Map<Long, List<String>>>();

你可以这样做:

Map<String, Map<Long, List<String>>> map = Maps.newHashMap();

填充地图也很容易:

ImmutableMap<String,String> map = ImmutableMap.of("key1", "value1", "key2", "value2");

现在,我发现了 Guava 中存在的其他一些有用的实用程序。例如,CharMatcher 类允许您匹配字符序列。你可以这样做:

CharMatcher.inRange('a','z').or(inRange('A','Z'));

String phoneNumber = CharMatcher.DIGIT.retainFrom("my phone number is 123456789");

【讨论】:

    【解决方案4】:

    CharMatcher 的 precomputed() 方法 (source) 是我前几天偶然发现的一个不错的“隐藏功能”。

    这实际上只是一种优化,它创建了一个查找表(使用位数组),然后简单地查找字符以查看它们是否“匹配”。

    这是您在使用库时可以利用的隐藏优化,您可能在自己的代码中没有想到。

    当然, 如果你创建了一个复杂的 CharMatcher,你打算多次使用它,你必须记得调用 precomputed() 方法,比如:

    CharMatcher complexMatcher = CharMatcher.anyOf("cat")
                                            .or(CharMatcher.DIGIT)
                                            .or(CharMatcher.WHITESPACE)
                                            .precomputed();
    

    【讨论】:

    • 我对番石榴ListenableFuture也有疑问。如果可能的话,你能否回顾一下我的设计并帮助我澄清我的一些疑问以及我应该如何处理它们?我最近开始使用 Guava ListenableFuture,我非常喜欢,但对如何有效使用它们有些困惑。
    【解决方案5】:

    这是来自 Google 的YouTube video(演讲者:Kevin Bourrillion,Google 核心 Java 库的首席工程师),它展示了 Google Collections 的美妙之处。 Google 所做的一件我认为非常棒的事情是保证集合的不变性。

    【讨论】:

      【解决方案6】:

      Google Guava 是一个实用程序库,所以我怀疑其中是否存在杀手级。关于实用程序的全部内容是您几乎在您拥有的每个项目中都使用它。我不记得我做过的任何不使用 Java 集合的项目。事实上,Google Guava 的收集工具非常棒,应该在 Java SDK 本身中。

      我已经写了三篇关于 Google Guava 上的类的文章:

      这还不是全部,你可以用番石榴做很多其他事情。

      【讨论】:

        【解决方案7】:

        绝对非常有用。它几乎总是添加到新项目中的第一个库。

        1. 我们非常喜欢 Iterators/Iterables 和 Function 接口。
        2. Service 接口系列是很好的抽象
        3. 我们非常坚定,已开始使用我们的 API 类型的 ImmutableXXX 类进行通信,它无法更改。
        4. 计算地图(来自 MapMaker)在某些情况下非常棒。

        总的来说,图书馆的质量非常高。 API经过深思熟虑,实施扎实。强烈推荐。

        【讨论】:

          【解决方案8】:

          MapMaker 现在提供有界 LRU 缓存 - 这是隐藏在微小 API 后面的一些重要机器。这具有巨大的实用性潜力,我仍然在代码中。

          【讨论】:

            猜你喜欢
            • 2010-09-08
            • 2011-02-03
            • 2010-09-08
            • 2010-10-25
            • 1970-01-01
            • 2010-10-17
            • 2011-06-25
            • 2010-12-11
            • 1970-01-01
            相关资源
            最近更新 更多