日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Google Guava库必需品

發(fā)布時間:2023/12/3 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Google Guava库必需品 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
我希望代碼簡單,短而又易于閱讀。 不必要的復雜性分散了人們對真實情況的理解,使他們難以理解,并且可能成為生產力的真正殺手。

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

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

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

換句話說:細節(jié)中有魔鬼。

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

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

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

實現(xiàn)toString的類在進行調試和日志記錄時非常令人愉悅,但是確實是一個痛苦的實現(xiàn)。 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}

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

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

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

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

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

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的鍵和值之間實現(xiàn)了一對一的雙向關系。 這是一個使用語言代碼獲取語言的示例,反之亦然。

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

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

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

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

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

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

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

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。 但是請記住,從修改中刪除是雙向的。 例如從原點移除會影響結果,反之亦然。

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

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

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的實現(xiàn)以及測試 。

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

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

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

相關文章 :

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

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

總結

以上是生活随笔為你收集整理的Google Guava库必需品的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。