2010-09-21 33 views
122

我已經快速掃描了Guava API及其提供的新集合類型(例如MultimapBiMap顯示有用),並且我正在考慮將該庫包含在項目中)我工作。然而,如果圖書館沒有很大的好處,並且學習這些功能浪費寶貴的時間,我也會無動於衷。Java的Guava庫;它有什麼最有用的和/或隱藏的功能

您是否已將Guava圖庫納入您的項目,並以任何意外的方式證明它有用?你會在將來總是使用它嗎?它的主要優點/節省時間是什麼?它的隱藏功能是什麼?

+4

您的標題和您的問題不匹配。 – aioobe 2010-09-21 10:41:11

+4

「新的集合類型......顯得有用」和「我對圖書館沒有保留......如果它們沒有很大的好處」 - 那麼它是什麼呢?你要麼認爲圖書館是有用的,並有好處,或者你不需要 – 2010-09-21 11:41:09

+0

截至2017年(現在問題已關閉),如果你使用最新的Gradle(4.4.1)番石榴21.0默認添加到build.gradle作爲依賴,用「這個依賴關係在內部使用,而不是在自己的編譯類路徑中暴露給消費者」,這表明Gradle團隊已經決定在那裏有一些非常有價值的東西。 – 2018-01-02 07:25:01

回答

152

嚴重的是,一切都在番石榴是非常有用的。我已經使用了它一段時間,並且仍然總是發現一些新的東西,我可以用它來處理代碼,而不是手動執行代碼。

有些東西別人真的沒有提到我愛:

  • Multimap s爲好了。任何時候你會使用像Map<Foo, Collection<Bar>>這樣的東西,而是使用一個multimap來代替,並且爲自己的映射到一個鍵的集合節省大量的繁瑣的檢查,並且如果它不在那裏創建和添加它。
  • Ordering是偉大的建築Comparator是你只是想如何,其行爲。
  • Maps.uniqueIndexMultimaps.index:這些方法採取IterableFunction和通過將所述函數應用於每個的結果建立在一個IterableImmutableMapImmutableListMultimap索引的值。因此,通過一個檢索項目ID的函數,您可以在一行中將它們的ID列表編入索引。
  • 它提供的功能性內容... filter,transform等。儘管使用Function s和Predicate s的類的詳細程度,我發現這很有用。我舉了一個方法的例子,以便很好地閱讀here
  • ComparisonChain是一個小的,容易被忽視上課的時候你想要寫的多個值連續進行比較,並在第一個差異時發現應返回的比較方法,它是非常有用的。它消除了所有這些乏味,使它只是幾行鏈式方法調用。
  • Objects.equal(Object,Object) - null安全等於。
  • Objects.hashCode(Object...) - 簡單的方法,可根據您的類的多個領域的哈希碼。
  • Objects.firstNonNull(Object,Object) - 降低了代碼得到一個默認值,如果第一個值是零,特別是如果第一個值是一個方法調用的結果(你必須這樣做的正常方式之前將其分配給一個變量) 。
  • CharMatcher小號已經提到過,但他們非常強大。
  • Throwables讓你做一些很好的事情拋出異常,如Throwables.propagate其重新拋出一個拋出,如果它是一個RuntimeExceptionError並把它包裝在RuntimeException並拋出,否則。

我當然可以繼續,但我必須去工作。 =)無論如何,儘管我列出了一些我喜歡的東西,事實上,番石榴的一切在某種情況下都是有用的。其中很多經常使用。當你使用它時,你會發現更多的用途。不使用它會感覺有點像將一隻手綁在背後。

+2

完全同意'ComparisionChain'。 – whiskeysierra 2010-09-29 23:59:42

42

我已經有效地在谷歌內部使用番石榴幾年了,這真是太棒了。

特別喜歡的部分是:

  • Charsets.* - 如此簡單,所以有用
  • 類別
  • IO處理(在一行中完全讀出的資源,等等)
  • Splitter/Joiner
  • Preconditions
+5

請注意,我們現在擁有Java 7+中的[StandardCharsets](https://docs.oracle.com/javase/7/docs/api/java/nio/charset/StandardCharsets.html)。我想知道Guava的其他功能還有多少其他功能已經進入Java。 – DavidS 2016-03-22 23:32:02

+0

我發現了這個[Modernizer Maven Plugin](https://github.com/andrewgaul/modernizer-maven-plugin),它檢測傳統API的使用,包括像Guava這樣的第三方庫。 [配置文件](https://github.com/andrewgaul/modernizer-maven-plugin/blob/master/src/main/resources/modernizer.xml)似乎包含67個Guava棄用,包括StandardCharsets。 – DavidS 2016-11-01 21:08:50

12

谷歌番石榴是一個實用程序庫,所以我懷疑它裏面有一個殺手級。關於效用的所有事情都是你在每個項目中都用到的。我記不起任何我沒有使用Java集合的項目。事實是,Google Guava的收集工具非常棒,應該在Java SDK本身。

我已經在谷歌番石榴寫三篇文章關於類:

這還不是全部,還有很多其他的事情可以做w ith番石榴。

16

這是Google的YouTube video(演講嘉賓:Google核心Java庫的首席工程師Kevin Bourrillion),展示了Google Collections的美妙之處。 Google所做的一件事,我相信它是輝煌的,保證收藏中的不變性。

27

我最初使用它爲集合簡寫。例如,而不是:

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"); 

現在,我已經發現了一些其他有用的工具出現在番石榴。例如,CharMatcher類允許您匹配字符序列。你可以這樣做:

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

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

CharMatcher的預計算()方法(source是我偶然發現的一個很好的「隱藏功能」。

這實際上只是一種優化,它會創建一個查找表(使用位數組),然後查找字符以查看它們是否「匹配」。

這是您在使用庫時可以利用的一種隱藏優化,您可能沒有想到自己在自己的代碼中。

當然, 如果你創建一個複雜的CharMatcher,您打算使用很多次,你必須記住調用預先計算()方法,如:

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

我也有番石榴的問題[ListenableFuture](http://stackoverflow.com/questions/29336280/how-to-properly-deal-with-exceptions-coming-from-listenablefuture-guava)。如果可能的話,你可以回顧一下我的設計,並幫助我澄清一些疑惑以及我應該如何處理它們?我最近開始與Guava ListenableFuture合作,我喜歡很多,但對如何有效地使用它們感到困惑。 – john 2015-03-30 04:48:19

8

絕對非常超級有用。幾乎總是第一個加入到新項目中的圖書館。

  1. 我們非常喜歡Iterators/Iterables和Function接口。
  2. 接口的服務系列是偉大的抽象
  3. 我們非常致力於我們已經開始使用我們的API類型的ImmutableXXX類來溝通它不能被改變。
  4. 計算地圖(來自MapMaker)在某些情況下非常棒。

總的來說,圖書館的質量很高。這個API是經過深思熟慮的,它的實現很紮實。強烈推薦。

7

MapMaker現在提供了有界的LRU緩存 - 這是一些隱藏在一個小API後面的重要機器。這有可能產生巨大的效用,而且我仍然遍佈代碼。