1. 程式人生 > >Google Guava的5個鮮為人知的特性

Google Guava的5個鮮為人知的特性

Google Guava有哪些比較冷門但卻又實用的特性呢?

它是最流行的開源庫之一,你應該聽過它的大名,它誕生的地方正是人們舉辦真正的魁地奇比賽的地方(起碼實習期內是這樣的)。它雖然不是來自哈利波特中的霍格沃茲學校,但卻有著自己的專屬魔力:Google Guava庫包含著許多誕生於Google的核心Java庫,這些都是公開發布後在生產環境經歷過了各種檢驗的。在Java 8之前它就已經包含Optional了。

Guava致力於提升常見任務的開發效率,通過它所提供的功能,開發人員能夠高效地完成更優質且更乾淨的程式碼。最著名的莫過於它裡面的集合庫和快取庫了。然而,它的很多非常實用的功能卻鮮為人知。說到集合和快取,Guava庫對JDK中的集合API進行了改進,同時它還填補了

直到去年才最終釋出的JCache的空缺(令人望眼欲穿)。本文我和大家分享的是在Takipi裡面我們所用到的一些Google Guava的特性,以及我們的一些有趣的發現。

注意:Guava支援Java 6及以上的版本。

1. 無符號基礎型別:它們真的存在!

Java 8中一個不太為人所知的特性就是它為無符號基礎型別所提供的新的解決方案。但更加不為人所知的是在Java 8釋出很久之前Guava庫就已經有了這個功能了,目前在Java 6及以後的版本中均能使用。我們來看下Guava是如何解決這個問題的。現在在我們面前有兩種選擇,到底使用哪種最好保持一致:

直接將基礎型別當int來使用,但要記清楚它可是無符號的:

int notReallyInt = UnsignedInts.parseUnsignedInt(4294967295); // Max unsigned int
 String maxUnsigned = UnsignedInts.toString(notReallyInt); // We’re legit!

UnsignedInts與UnsignedLongs還支援compare, divide, min, max等方法。

你還可以使用包裝型別,這樣能避免直接使用基礎型別容易帶來的混淆:

UnsignedInteger newType = UnsignedInteger.valueOf(maxUnsigned
); newType = newType.plus(UnsignedInteger.valueOf("1")); // Increment

UnsignedInts與UnsignedLongs還支援minus, times, dividedBy以及mod方法。

2. 雜湊:128位的MurmurHash

看一下Java標準庫中的非加密雜湊演算法你會發現少了MurmurHash,這是一個簡單高效且還是分散式的演算法,在許多語言中都有著很好的支援。我們並不是說要用它來取代Java的hashCode方法,不過如果你想要生成大量的雜湊值而32位已經不夠用了,但又希望能有一個高效而不會影響到效能的演算法,那肯定就是它了。下面是Guava中的實現:

HashFunction hf = Hashing.murmur3_128(); // 32bit version available as wellHashCode hc = hf.newHasher()
   .putLong(id)
   .putString(name, Charsets.UTF_8)
   .putObject(person, personFunnel)
   .hash();
  
  

你可以使用Funnel來對物件進行分解,裡面包含了用於讀取物件的指令,假設我們有一個帶ID,名字以及出生年份的Person物件:

Funnel<Person> personFunnel = new Funnel<Person>() {
   @Override
   public void funnel(Person person, PrimitiveSink into) {
   into
      .putInt(person.id)
      .putString(person.firstName, Charsets.UTF_8)
      .putString(person.lastName, Charsets.UTF_8)
      .putInt(birthYear);
   }};

3. InternetDomainName:用它來取代你的域名校驗器

Guava還有一個很酷的功能就是它的InternetDomainName,用它來解析及修改域名簡直是得心應手。如果你自己寫過類似的功能的話,你就會知道它提供的方式是多高效優雅了。它是Mozilla基金會發起的專案,遵循最新的RFC規範,它採用的是公共字尾列表(Public Suffix List, PSL)中的域名列表。與apache-common庫中的競爭者相比,它還提供了許多專門的方法。我們來看一個簡單的例子:

InternetDomainName owner =
   InternetDomainName.from("blog.takipi.com").topPrivateDomain(); // returns takipi.com
 InternetDomainName.isValid(takipi.monsters"); // returns false

關於域名有幾個概念是比較容易混淆的:publicSuffix()返回的是對應著公共字尾列表中的獨立實體的頂級域名。因此返回的可能會有co.uk, .com, .cool這樣的結果(沒錯,.cool是一個真實的字尾,比如javais.cool, scalais.cool以及cppis.cool)。而topPrivateDomain(),這是對應公共字尾列表的一個獨立實體的私有域名。在blog.takipi.com上呼叫這個方法會返回takipi.com,但如果你把它用於某個github主頁,比如username.github.io的話則會返回username.github.io,因為這在PSL上是一個單獨的實體。

當你需要校驗域名的時候這個功能就派上用場了,比如我們最近給將JIRA整合進Takipi的時候,首先我們要檢查你的JIRA域名,然後才能連線到Takipi的生產環境的錯誤分析工具中。

4. ClassPath反射:魔鏡,魔鏡

看一下Java的反射機制,也就是它的檢視自身程式碼的能力,你會發現,要想列出所在包或者專案中的所有類可不是一件簡單的事情。這是Guava中我們非常喜歡的一個特性,它還能獲取當前執行環境的許多相關資訊。使用起來非常簡單:

ClassPath classpath = ClassPath.from(classloader);for (ClassPath.ClassInfo classInfo : classpath.getTopLevelClasses("com.mycomp.mypackage")) {
   System.out.println(classInfo.getName());}

這段程式碼會遍歷你指定包中的所有類並打印出它們的名字。這裡要說明的是它只會掃描我們指定的包的物理路徑下的類。如果類是從其它地方載入進來的則不在此列,因此使用它的時候請務必小心,不然你得到的結果就是錯誤的了。

5: CharMatcher:簡化版正則?

我們用一個你肯定會碰到過的問題來結束這最後一個特性。假設你有一個字串,或者許多字串,你希望對它們進行格式化,比如刪除空格或者別的字元,替換某個字元等等。總的來說,就是提取匹配某個模式的字元然後進行某個操作。Guava提供了CharMatcher,使得這類問題的處理更得更加優雅。

對於這類任務,庫裡有許多預定義好的模式,比如JAVAUPPERCASE(大寫字元),JAVA_DIGIT(數字),INVISIBLE(不可見UNICODE字元)等。除了這些預定義的模式外,你還可以建立自己想要的模式。我們用一段簡短的示例來看下它是如何使用的:

String spaced = CharMatcher.WHITESPACE.trimAndCollapseFrom(string,  );

它會擷取掉字串末尾的空格並將中間連續的空格合併成一個。

String keepAlex = CharMatcher.anyOf(alex).retainFrom(someOtherString);

而這行會將一個字串中我的名字裡沒有的字元都去掉。如果我是一名說唱歌手的話,這將是我的歌曲揚名之時。

結論

這裡我們介紹了Google Guava庫中的一些非常有趣的特性,當然了,不包括家喻戶曉的集合庫以及快取庫。這裡面有些功能是在Takipi中廣泛用到的,而有些功能是我們覺得比較實用,相信許多專案都能從中受益的。Google Guava庫讓開發人員變得更加高效,而這也正是我們Takipi所開發的工具想要實現的目標(它可是相當酷的,不信你可以試試

相關推薦

Google Guava的5鮮為人知特性

Google Guava有哪些比較冷門但卻又實用的特性呢? 它是最流行的開源庫之一,你應該聽過它的大名,它誕生的地方正是人們舉辦真正的魁地奇比賽的地方(起碼實習期內是這樣的)。它雖然不是來自哈利波特中的霍格沃茲學校,但卻有著自己的專屬魔力:Google Guava庫包

Java 9 中的 9 特性

不想 行為 添加元素 ase 結合 quest 簡單 通過 this Java 8 發布三年多之後,即將快到2017年7月下一個版本發布的日期了。 你可能已經聽說過 Java 9 的模塊系統,但是這個新版本還有許多其它的更新。 這裏有九個令人興奮的新功能將與 Java 9

Visual Studio Debugger中七鮮為人知的小功能

.cn disable 轉載 解決問題 內存 初始 -668 調試工具 利用 Visual Studio debugger是一個很棒的調試工具,可以幫助程序猿們快速地發現和解決問題。這裏給大家簡單介紹一下VS調試工具中的七個鮮為人知的小功能。 1. 一鍵跳轉到指定語句

java語言的11關鍵特性

webserver 結合 解釋執行 是把 做的 自己 不同 個性 類繼承 (1)easy:java的語法比c++的相對簡單,另一個方面就是java能使軟件在很小的機器上運行,基礎解釋其和類庫的支持的大小約為40kb,增加基本的標準庫和線程支持的內存需要增加125kb。 (2

HTML5你必須知道的28特性

html5你必須知道的28個新特性HTML5有很多的新功能.新代碼.非常不錯.現在總結一下.僅供參考1. 新的Doctype盡管使用<!DOCTYPE html>,即使瀏覽器不懂這句話也會按照標準模式去渲染2. Figure元素 用<figure>和<figcaption>

JDK1.8的幾特性

bsp 我們 get per 年齡 就是 person int ++ 場景一:假設我們有一個 List 包含一系列的 Person,Person 有姓名 name 和年齡 age 連個字段。現要求這個列表中年齡大於 20 的人數。通常按照以前我們可能會這麽寫:long co

類有哪三基本特性?各特性的優點?

封裝 創建 隱藏 目的 多級 變量 成員 表現 解答 類有哪三個基本特性?各特性的優點? 解答:類具有封裝性、繼承性和多態性。 封裝性:類的封裝性為類的成員提供公有、缺省、保護和私有等多級訪問權限,目的是隱藏類中的私有變量和類中方法的實現細節。 繼承性:類的繼

Redis 5.0 正式版釋出了,19 特性

轉載自  Redis 5.0 正式版釋出了,19 個新特性 Redis 5.0 GA 正式版釋出了! 下載地址: download.redis.io/releases/redis-5.0.0.tar.gz 原始碼下載: github.com/an

用了Python這麼多年,才發現 Python還有這8鮮為人知的語法……

C++、Java大神Bruce Eckel幾個月前在中國之行中,毫不掩飾的表達了對Python的偏愛:“坦白來講,我最喜歡的語言是Python。每當我有問題需要被解決的時候我發現Python是最快可以給我結果的一個語言,所以我很喜歡,很享受Python。” 有資料顯示,2017年在僱主釋出的職位

用了Python這麼多年,才發現Python還有這8鮮為人知的語法……

C++、Java大神Bruce Eckel幾個月前在中國之行中,毫不掩飾的表達了對Python的偏愛:“坦白來講,我最喜歡的語言是Python。每當我有問題需要被解決的時候我發現Python是最快可以給我結果的一個語言,所以我很喜歡,很享受Python。” 有資料顯示,2017年在僱主釋出的職位

Java 11的8特性

Java 11又出新版本了,我還在Java8上停著。不過這也擋不住我對他的熱愛,忍不住查看了一下他的新效能,由於自己知識有限,只總結了以下八個特性; 1、本地變數型別推斷 什麼是區域性變數型別推斷?     var javastack = "javastack";  &nb

谷歌Google競價中鮮為人知的方法

來源:世界工廠網線上生態學院 作者:布布_桃子 Google佔據了全球90%以上的搜尋流量,就像我們在中國遇到問題大家都會“百度一下”,在海外大家有事沒事都會google一下。如果在google上展示自己的產品廣告,曝光和點選一定是非常可觀的,因此如何利用goo

基於Visual Studio2010講解C 4特性

                Csharp4.0與以往版本的基礎了體現了強大的效能優勢,主要體現於四個方面:1. 通過委託成員來實現介面  在C# 4.0中可以通過委託來實現某個成員的介面,例如下面的程式碼:[c-sharp] view plain copy print?publicclass Foo : 

C++你不知道的那些事兒—C++語言的15晦澀特性

這個列表收集了 C++ 語言的一些晦澀(Obscure)特性,是我經年累月研究這門語言的各個方面收集起來的。C++非常龐大,我總是能學到一些新知識。即使你對C++已瞭如指掌,也希望你能從列表中學到一些東西。下面列舉的特性,根據晦澀程度由淺入深進行排序。 1. 方括號的真正含義 2. 最煩人的解析 3

JDK1.8十特性

本日記將Java8的新特新逐一列出,並將使用簡單的程式碼示例來指導你如何使用預設介面方法,lambda表示式,方法引用以及多重Annotation,之後你將會學到最新的API上的改進,比如流,函式式介面,Map以及全新的日期API “Java is still not dead—and people are

Java 11 釋出計劃來了,已確定 3特性!!

Oracle 已經發布了 Java Development Kit 10,下一個版本 JDK 11 也在準備之中了。按照 Java 新的版本釋出標準,Java 11 將在 6 個月後到來,現在它還只有一部分新功能。 據瞭解,Java 11 將移除 CORB

JDK7新特性_JDK7的六特性

二進位制字面量 JDK7開始,終於可以用二進位制來表示整數( byte,short,int和long)。使用二進位制字面 量的好處是,可以使程式碼更容易被理解。 語法非常簡單,只要在二進位制數

開發者不可不知的Google Chrome七大新特性

Google Chrome 在日常生活中扮演的角色不只是一個功能強大的網路瀏覽器,它內建的 DevTools 同樣也是網路開發者進行網路開發的重要工具。 DevTools 在不斷的進行版本更新,其中有很多重要的更新細節你可能會錯過。在這裡羅列了 Google Ch

盤點VS2015 預覽版的5特性

Visual Studio 2015 Preview包含了很多強大的新特性,無論你是從事Web應用程式開發,還是桌面應用程式開發,甚至是移動應用開發,VS 2015都將大大提高你的開發效率。有幾個特性非常有亮點,比如編輯器支援手勢識別、Cordova工具包、C++增強工具和最新的Android模擬器。其他的

10 鮮為人知的 Unity 技巧

1. ALT + 滑鼠左鍵點選 Hierarchy 物件可以展開和收起物件的所有子物件 2. 在當前編輯器視窗中摁下 SHIFT + 空格鍵 可以最大化/最小化當前視窗 3. 編輯器中大部分數值型別的輸入框都可以輸入數值運算,拾色器內的輸入框也不例外