Google Guava庫必需品

我希望代碼簡單,短而又易于閱讀。 不必要的復雜性分散了人們對真實情況的理解,使他們難以理解,并且可能成為生產力的真正殺手。

您知道,纏結的for循環和索引可以跟蹤是否/其他情況和切換用例,空/驗證檢查,轉換/復制/刪除/排序集合,異常處理……列表隨著行號和維護負擔的增加而繼續存在。

我想到了托尼·霍爾的一句名言。

構建軟件設計的方法有兩種:一種方法是使它變得如此簡單,以至于顯然沒有缺陷,另一種方法是使它變得如此復雜以至于沒有明顯的缺陷。

換句話說:細節中有魔鬼。

Apache Commons具有補充JDK API的一些最出色的庫,但本文與Commons無關。 它是關于Google Guava的 ,在很多方面都與Commons類似。 它為常用的日常任務提供了一個庫,例如集合處理,字符串處理,并發,IO,基元,異常等。

Guava中有很多很棒的東西,我沒有時間去瀏覽完整的庫,但是這里至少有一些它可以做什么的例子。

對象
使用對象可以輕松地實現哈希碼/等式,而不會使您的類過于混亂(對我而言,Eclipse自動生成往往有些冗長)。

實現toString的類在進行調試和日志記錄時非常令人愉悅,但是確實是一個痛苦的實現。 Objects.toStringHelper使得此操作非常容易,并且還有助于維護打印對象的一致格式。

public class Item {private String id;private String name;public Item(String id, String name) {this.id = id;this.id = name;}public String getId() {return id;}public String getName() {return name;}@Overridepublic int hashCode() {return Objects.hashCode(getId(), getName());}@Overridepublic String toString() {return Objects.toStringHelper(this).add("id", getId()).add("name", getName()).toString();}@Overridepublic boolean equals(Object o) {if (!(o instanceof Item)) {return false;}Item other = (Item) o;return Objects.equal(getId(), other.getId()) && Objects.equal(getName(), other.getName());}
}

打印此類會輸出類似這樣的內容。

Item{id=1, name=Book}

可拋物
包裝原始異常對象并不總是合適的,因為如果不相關的類加載器之間發生通信,或者在網絡上對其進行序列化,則可能導致客戶端代碼中的ClassNotFoundException。 Throwables可以解除這種依賴關系,仍然允許遠程客戶端通過將其轉換為字符串來查看堆棧跟蹤。

try {// throws implementation specific exception
} catch (InternalException e) {throw new ApiException("reason", Throwables.getStackTraceAsString(e));
}

可迭代
連接兩個單獨的集合并對結果執行操作可能會導致很多混亂。 遍地搶救。 花一點時間,思考一下如果沒有Iterables.concat,代碼的外觀如何。

for (Item item : Iterables.concat(books, electronics)) {// do something useful
}

多圖
Multimap就像一個Map,但是允許為每個鍵存儲多個值。 以下示例是類型安全的異構容器的變體,該容器使用multimap來實現商品的產品目錄。

public class ProductCatalogue {private Multimap<Class,? extends Item>, Item> catalogue = ArrayListMultimap.create();public void add(Item item) {catalogue.put(item.getClass(), item);}public <T extends Item> Collection<Item> list(Class<T> clazz) {return catalogue.get(clazz);}
}ProductCatalogue catalogue = new ProductCatalogue();
catalogue.add(new Book("1", "Book1"));
catalogue.add(new Movie("2", "Movie1"));
// only get books
System.out.println("Books " + catalogue.list(Book.class));
// only get movies
System.out.println("Movies " + catalogue.list(Movie.class));

雙圖
BiMap在Map的鍵和值之間實現了一對一的雙向關系。 這是一個使用語言代碼獲取語言的示例,反之亦然。

BiMap<String, String> languageCodes = HashBiMap.create();
languageCodes.put("en", "English");
languageCodes.put("fr", "French");
languageCodes.put("zh", "Chinese");
assert "English" == languageCodes.get("en");
assert "en" == languageCodes.inverse().get("English");

前提條件
大多數類在構造函數和方法中給定的值都有限制。 無效值應通過在執行前進行顯式有效性檢查來盡快升級。 快速故障要比以后由于意外的異常而失敗,或更糟糕的是,靜默地計算錯誤的結果要好得多。

public Item(String id, String name) {this.id = Preconditions.checkNotNull(id, "id must not be null");this.name = Preconditions.checkNotNull(name, "name must not be null");Preconditions.checkArgument(name.length() > 6, "name must be longer than 6 chars");
}

約束條件
約束與先決條件類似,它們可以限制將哪些值添加到集合中。 由于約束與業務代碼分離,因此這使集合的使用更加容易并且代碼更加簡潔。

public class Voyage {private Country targetcountry;private int capacity;private List<Cargo> items = Constraints.constrainedList(new ArrayList<Cargo>(), new Constraint<Cargo>() {@Overridepublic Cargo checkElement(Cargo cargo) {Preconditions.checkNotNull(cargo);Preconditions.checkArgument(targetcountry.allows(cargo));Preconditions.checkArgument(cargo.getUnits() gt; 0);return cargo;}});public void load(List<Cargo> cargos) {items.addAll(cargos);}
}

謂詞和功能
謂詞評估是真還是假,但也可以使用“與”,“或”,“非”和“中”組合成更復雜的評估。

現在通常需要for循環和一堆if語句的內容現在可以簡化為單行代碼。 那有多甜?

Predicate<Item> heavyItemPolicy = new Predicate<Item>() {@Overridepublic boolean apply(Item item) {if(item.getWeight() > 1000){return true;}return false;}
};
Collection<Item> heavyItems = Collections2.filter(order, heavyItemPolicy);

您也可以類似的方式使用Maps.filterKeys或Iterables.filter。 但是請記住,從修改中刪除是雙向的。 例如從原點移除會影響結果,反之亦然。

另一方面,函數是一種將一個對象轉換為另一個對象的方法。 例如,按項目順序轉換并發。

Function currencyConverter = new Function<Double, Item>() {@Overridepublic Double apply(Item item) {return item.getPrice() * ANOTHER_CURRENCY;}
}
Collection<Double> prices = Collections2.transform(order, currencyConverter);

您也可以類似的方式使用Maps.transformValues或Iterables.transform。

查詢API
一段時間以來,我一直在考慮如何創建簡單但功能強大的Fake Objects 。 但是我不希望假冒產品本身成為維護負擔,因此它們必須易于實施。 我的直覺告訴我,我需要一個通用的狀態管理框架來使其正常工作。 因此,我使用謂詞創建了一個小的流利查詢接口,該接口與內存中的存儲進行交互。

InMemoryStorage storage = new InMemoryStorage();
// add a few Item.class objects to storage
Criteria middleprice = field("price").is(largerThan(100)).and(lessThan(200));
Criteria expired = field("expires").is(after(currentDate));
Collection<Item> result = storage.select(middleprice.and(not(expired))).from(Item.class);

實際上,我對結果感到非常滿意-簡短,緊湊,易于理解和類型安全。

我在這里不做詳細介紹,但是請檢查Criteria和InMemoryStorage的實現以及測試 。

我希望這些示例將觸發您進一步研究 Guava,并使用它使您的代碼更具可讀性,魯棒性和可維護性。

最后,我確實希望這些功能中的許多功能能夠在不久的將來達到標準Java。

參考: Deep Hacks博客上 的詳細信息來自我們的JCG合作伙伴 KristofferSj?gren

相關文章 :

  • Java Lambda語法替代
  • Java中的低GC:使用原語而不是包裝器
  • Java泛型快速教程
  • Java最佳實踐教程系列

翻譯自: https://www.javacodegeeks.com/2011/09/google-guava-libraries-essentials.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/374746.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/374746.shtml
英文地址,請注明出處:http://en.pswp.cn/news/374746.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

單調棧3_水到極致的題 HDOJ4252

A Famous City 題目大意 給出正視圖 每一列為樓的高度 最少有幾座樓 坑點 樓高度可以為0 代表沒有樓 貢獻了兩發RE 原因 if(!s.empty()&&tem){s.push(tem); continue;}并不能篩去 空棧且 tem為0的情況 改為 if(!s.empty()){if(tem) s.push(tem); continue;} 后AC 題目…

eclipse配置遠程調試

一、配置 1、cd apache-tomcat/bin 2、vi startup.sh文件 3、在文件開頭處&#xff0c;添加下方代碼(address代表的是調試端口) declare -x CATALINA_OPTS"-Xdebug -Xnoagent -Djava.compilerNONE -Xrunjdwp:servery,transportdt_socket,suspendn,address…

力扣兩數之和 II - 輸入有序數組

題目:給定一個已按照 非遞減順序排列 的整數數組 numbers &#xff0c;請你從數組中找出兩個數滿足相加之和等于目標數 target 。 我的代碼&#xff1a; 對撞指針 class Solution {public int[] twoSum(int[] numbers, int target) {int low 0;//指向頭int high numbers.le…

SpringMVC 3 Tiles 2.2.2集成教程

Apache Tiles是基于Java的Web應用程序的流行且最常用的模板框架。 由于Struts 1.x使用Tiles作為其默認模板框架&#xff0c;因此Tiles變得更加流行。 SpringMVC是一個MVC框架&#xff0c;例如Struts &#xff0c;也支持將Tiles集成為其模板框架。 讓我們看看如何集成SpringMVC和…

[團隊項目3.0]Scrum團隊成立

Scrum團隊成立 5.Scrum團隊成立 5.1 團隊名稱&#xff0c;團隊目標、團隊口號、團隊照&#xff1b; 5.2 角色分配 產品負責人: 決定開發內容和優先級排序&#xff0c;最大化產品以及開發團隊工作的價值。 Scrum Master&#xff1a; 負責確保團隊遵循 Scrum 的理論、實踐和規則。…

Base64編碼的java實現

Java本身是提供了Base64編碼的工具包的&#xff0c;做項目的時候自己實現了個&#xff0c;在這里記錄一下&#xff1a; 1 /** Base64編碼數組 */2 private static final String base64EncodeChars "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456…

Character.isLetterOrDigit(ch)判斷ch是否為字母或數字

Character.isLetter(ch) 判斷ch是否為字母 Character.isDigit(ch) 判斷ch是否為數字 Character.isLetterOrDigit(ch) 判斷ch是否為字母或數字 /* 例子*/char ch q;System.out.println(Character.isLetter(ch));System.out.println(Character.isDigit(ch));System.out.print…

高級SmartGWT教程,第1部分

賈斯汀&#xff08;Justin&#xff09;&#xff0c;帕特&#xff08;Pat&#xff09;和我已經開始著手一個需要用戶界面進行管理和管理的副項目。 在與SmartGWT和GWT共同工作了一段時間之后&#xff0c;我們決定使用SmartGWT創建接口。 我們非常喜歡視覺組件&#xff08;請查看…

git 技巧

將某個文件回退到某個版本 git co d359624286d9c1f022b8b3b6f2d3fe3b6524188b build.sh 查看某個文件在某個版本時的內容 git show d359624286d9c1f022b8b3b6f2d3fe3b6524188b:build.sh 如果想把這個文件重命名保存 git show d359624286d9c1f022b8b3b6f2d3fe3b6524188b:build.s…

機會

民生電商的機會.地點在成都. 聯系 &#xff1a;iskall0 at 163.com 待遇 &#xff1a;和BAT差不多. H5方向&#xff1a; 前端功底扎實.對H5有較深的理解和造詣.大數據方向1&#xff1a; SSH玩的熟.linux玩的熟.熟悉云計算架構和SOA.MySQL玩的熟,PostgreSQL加分 : ]熟Hadoop、St…

力扣驗證回文串

給定一個字符串&#xff0c;驗證它是否是回文串&#xff0c;只考慮字母和數字字符&#xff0c;可以忽略字母的大小寫 代碼思路&#xff1a;將s中的每個字符用for循環取出&#xff0c;判斷一下&#xff0c;如果是字母或者數字&#xff0c;插入到StringBuffer類型sgood中&#xf…

Spring MVC3 Hibernate CRUD示例應用程序

學習從HelloWorld應用程序開始的任何Web框架都是一個好主意。 一旦我們熟悉了框架配置&#xff0c;最好做一個CRUD&#xff08;創建&#xff0c;讀取&#xff0c;更新&#xff0c;刪除&#xff09;應用程序&#xff0c;該應用程序涵蓋Web框架的各個方面&#xff0c;例如驗證&am…

Linux Mint---ATI顯卡驅動安裝篇

顯卡驅動可謂是至關重要&#xff0c;當時折騰debian驅動的時候可是弄了好幾天才搞定的&#xff0c;現在卻非常容易就是裝上&#xff0c; 詳見這篇博客&#xff1a;http://www.yyearth.com/article/14-03/amd13.html 在此表示感謝&#xff01; 我的話&#xff0c;全在圖形界面下…

百度云推送的簡單集成

1.在百度云推送的應用管理頁面&#xff0c;創建自己的應用&#xff0c;創建應用時&#xff0c;需要提供兩個證書&#xff0c;開發環境的推送證書和正式環境的推送證書。證書的格式是pem格式的&#xff0c;需要先在apple 開發者中心配置好推送證書&#xff0c;安裝到mac上&#…

高級SmartGWT教程,第2部分

這是我的教程的第二部分&#xff0c;有關使用SmartGWT快速進行UI開發。 在本教程的第一部分中 &#xff0c;我們創建了基本的界面布局并添加了一些基本組件。 現在是時候解決這個問題&#xff0c;并使用SmartGWT的真正功能了。 在繼續之前&#xff0c;讓我們記住到目前為止我們…

有感而發,生活

我們每一個人都是獨一無二的&#xff0c;當然我們每一個人的路子也是不盡相同的&#xff0c;不能因為一時的失意而放棄了自己兒時的夢想&#xff0c;路是一步一步走的&#xff0c;未來需要努力&#xff0c;我相信 我們每一個人都可以做到自己心中的樣子&#xff0c;安逸的生活是…

力扣反轉字符串中的元音字母

給你一個字符串 s &#xff0c;僅反轉字符串中的所有元音字母&#xff0c;并返回結果字符串。 元音字母包括 ‘a’、‘e’、‘i’、‘o’、‘u’&#xff0c;且可能以大小寫兩種形式出現。 代碼思路&#xff1a; 1.將字符串轉換為字符數組 2.設置碰撞指針&#xff0c;從兩頭尋…

使用 SqlDataSource 插入、更新和刪除數據49

簡介 正如在 數據插入、更新和刪除概述 中討論的那樣&#xff0c;GridView 控件提供內置的更新和刪除功能&#xff0c;而DetailsView 和 FormView 控件則包含對插入、編輯和刪除功能的支持。這些數據修改功能無需編寫任何代碼&#xff0c;可直接嵌入數據源控件。 數據插入、更新…

Solaris是出色的Java開發平臺的原因

幾天前&#xff0c;我發布了“ OpenSolaris的死亡&#xff1a;為Java開發人員選擇操作系統 ”&#xff0c;其中我說Solaris是Java開發人員的絕佳平臺。 這篇文章的重點只是想知道自OpenSolaris淘汰以來我將使用哪個Solaris版本。 正如Neil的評論使我意識到的那樣&#xff0c;該…

python , angular js 學習記錄【2】

1.不同scope之間的通信 &#xff08;1&#xff09;無父子關系的scope通信&#xff1a; 在需要操作的scope里面定義一個事件&#xff0c;名稱為delete_host&#xff0c;參數為data $rootScope.$on(delete_host, function(event,data) {angular.forEach($scope.hosts, function (…