Java的Guava库;它最有用和/或隐藏的功能是什么[关闭]

问题

我快速扫描了Guava API以及它提供的新集合类型(MultimapBiMap,例如看起来很有用),我想将库包含在我工作的项目中。然而,如果它们没有什么好处并且学习这些功能会浪费宝贵的时间,我也会毫不犹豫地将这些图书馆包括在内。

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


#1 热门回答(153 赞)

说真的,番石榴中的一切都很有用。我已经使用它已经有一段时间了,我仍然总是发现一些新东西,我可以用它来做,所需的代码少于手工操作。

其他一些事情没有真正提到我喜欢:

  • Multimaps非常棒。任何时候你都会使用Map <Foo,Collection <Bar >>这样的东西,而是使用多图来代替,并为自己节省大量繁琐的检查,查看映射到密钥的现有集合,如果不存在则创建并添加它。
  • 订购非常适合构建符合你需求的比较器。
  • Maps.uniqueIndex和Multimaps.index:这些方法采用Iterable和Function,并构建一个ImmutableMap或ImmutableListMultimap,它通过将函数应用于每个函数的结果来索引Iterable中的值。因此,使用检索项目ID的函数,你可以按一行中的ID索引项目列表。
  • 它提供的功能......过滤,转换等。尽管使用函数和谓词类的详细程度,我发现这很有用。我举一个例子来说明这里很好地阅读。
  • ComparisonChain是一个很容易被忽略的小类,当你想要编写一个比较多个连续值的比较方法并且应该在找到第一个差异时返回时,它很有用。它删除了它的所有乏味,使它只是几行链式方法调用。
  • Objects.equal(Object,Object) - null safe equals。
  • Objects.hashCode(Object ...) - 基于类的多个字段获取哈希码的简便方法。
  • Objects.firstNonNull(Object,Object) - 如果第一个值为null,则减少获取默认值的代码,特别是如果第一个值是方法调用的结果(在执行之前必须将其分配给变量)这是正常的方式)。
  • CharMatchers已被提及,但它们非常强大。
  • Throwables允许你使用throwables做一些不错的事情,例如Throwables.propagate如果是RuntimeException则重新抛出throwable,或者在RuntimeException中包装它并抛出它。

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


#2 热门回答(42 赞)

我在Google内部已经有效地使用Guava了几年 - 这太棒了。

我特别喜欢的部分是:

  • Charsets。* - 这么简单,非常实用
  • 收藏
  • IO处理(完全在一行中读取资源等)
  • 分离器/细木工
  • 先决条件

#3 热门回答(28 赞)

我最初用它来收集藏品。例如,而不是:

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

你可以这样做:

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

填充 Map 也很容易:

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

现在,我发现了番石榴中存在的一些其他有用的实用程序。例如,CharMatcherclass允许你匹配字符序列。你可以做:

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

要么

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