Google Guava v07范例

我們在TouK舉辦了一個名為“每周技術研討會”的活動,即每個星期五的16:00,每個愿意參加的人都有一個演講。 我們展示了我們在家學習和學習的東西,但是我們也設有一個公告板,上面有人們想聽的話題。 上周MaciejPróchniak談論了Clojure ,這次有幾個人要求介紹Google Guava庫 。

由于這是一項艱巨而簡單的任務,所以我很樂意交付。

WTF是番石榴嗎?

這是一組非常簡單的基本類,您最終還是要自己編寫。 僅由Google來思考Apache的共同點。 只是為了讓您的生活更輕松一點。

Wiktor Gworek在Javarsowia 2010上做了一個早期(v04) 演講 ,另外一個是波蘭語演講 。

在撰寫本文時,最新版本是v07,已經過Mavenized,可以在公共Maven repo上找到 。

這是一些有趣的事情的快速回顧。 不過,不要期望任何花哨的東西,Guava非常基礎。

@VisibleForTesting

一個簡單的注釋,告訴您為什么放寬了特定的屬性訪問限制。

在測試中使用的一個常見技巧是放寬對特定屬性的默認訪問限制,以便您可以在單元測試中使用它,該單元測試位于相同的程序包中(盡管在不同的目錄中)。 無論是好是壞,請記住給開發人員一個提示。

考慮:

public class User {private Long id;private String firstName;private String lastName;String login;

為什么登錄程序包有作用域?

public class User {private Long id;private String firstName;private String lastName;@VisibleForTesting String login;

啊,那是為什么。

前提條件

Guava有一些防御性編程的先決條件(按合同設計),但不如Apache Commons / Spring框架具備的條件好。 有趣的一件事是Guava解決方案返回了對象,因此可以進行內聯。 考慮:

使用手寫的前提條件:

public User(Long id, String firstName, String lastName, String login) {validateParameters(id, firstName, lastName, login);this.id = id;this.firstName = firstName;this.lastName = lastName;this.login = login.toLowerCase();}private void validateParameters(Long id, String firstName, String lastName, String login) {if(id == null ) {throw new IllegalArgumentException('id cannot be null');}if(firstName == null || firstName.length() == 0) {throw new IllegalArgumentException('firstName cannot be empty');}if(lastName == null || lastName.length() == 0) {throw new IllegalArgumentException('lastName cannot be empty');}if(login == null || login.length() == 0) {throw new IllegalArgumentException('login cannot be empty');}}

使用番石榴先決條件:

public void fullyImplementedGuavaConstructorWouldBe(Long id, String firstName, String lastName, String login) {this.id = checkNotNull(id);this.firstName = checkNotNull(firstName);this.lastName = checkNotNull(lastName);this.login = checkNotNull(login);checkArgument(firstName.length() > 0);checkArgument(lastName.length() > 0);checkArgument(login.length() > 0);}

(感謝Yom注意到checkNotNull必須在checkArgument之前進行,盡管這有點不直觀)

使用spring或apache commons前提(兩個庫的用法看起來完全一樣):

public void springConstructorWouldBe(Long id, String firstName, String lastName, String login) {notNull(id); hasText(firstName); hasText(lastName); hasText(login);this.id = id;this.firstName = firstName;this.lastName = lastName;this.login = login;}

CharMatcher

對于討厭regexp或只想要簡單美觀的對象樣式模式匹配解決方案的人。

例子:

和/或易用性

String input = 'This invoice has an id of 192/10/10';CharMatcher charMatcher = CharMatcher.DIGIT.or(CharMatcher.is('/'));String output = charMatcher.retainFrom(input);

輸出是:192/10/10

否定:

String input = 'DO NOT scream at me!';CharMatcher charMatcher = CharMatcher.JAVA_LOWER_CASE.or(CharMatcher.WHITESPACE).negate();String output = charMatcher.retainFrom(input);

輸出是:DONOT!

范圍:

String input = 'DO NOT scream at me!';CharMatcher charMatcher = CharMatcher.inRange('m', 's').or(CharMatcher.is('a').or(CharMatcher.WHITESPACE));String output = charMatcher.retainFrom(input);

輸出是:sram am

細木工/分離器

顧名思義,它是正確完成字符串連接/拆分的方法,盡管我發現調用有點兒反轉了……哦,那是java。

String[] fantasyGenres = {'Space Opera', 'Horror', 'Magic realism', 'Religion'};String joined = Joiner.on(', ').join(fantasyGenres);

輸出:太空歌劇,恐怖片,魔幻現實主義,宗教

您可以跳過空值:

String[] fantasyGenres = {'Space Opera', null, 'Horror', 'Magic realism', null, 'Religion'};String joined = Joiner.on(', ').skipNulls().join(fantasyGenres);

輸出:太空歌劇,恐怖片,魔幻現實主義,宗教

您可以填寫空值:

String[] fantasyGenres = {'Space Opera', null, 'Horror', 'Magic realism', null, 'Religion'};String joined = Joiner.on(', ').useForNull('NULL!!!').join(fantasyGenres);

輸出:太空歌劇,NULL !!!,恐怖,魔術現實主義,NULL !!!,宗教

您可以加入地圖

Map<Integer, String> map = newHashMap();map.put(1, 'Space Opera');map.put(2, 'Horror');map.put(3, 'Magic realism');String joined = Joiner.on(', ').withKeyValueSeparator(' -> ').join(map);

輸出:1? 太空歌劇2 恐怖3? 魔幻現實主義

Split返回Iterable而不是JDK數組:

String input = 'Some very stupid data with ids of invoces like 121432, 3436534 and 8989898 inside';Iterable<String> splitted = Splitter.on(' ').split(input);

盡管您不能為每個“列”指定不同的長度,但Split會進行固定長度的拆分,這使得在解析某些導出效果不佳的Excel時,它的使用受到了限制。

String input ='A  1  1  1  1\n' +'B  1  2  2  2\n' +'C  1  2  3  3\n' +'D  1  2  5  3\n' +'E  3  2  5  4\n' +'F  3  3  7  5\n' +'G  3  3  7  5\n' +'H  3  3  9  7';Iterable<String> splitted = Splitter.fixedLength(3).trimResults().split(input);

您可以在拆分時使用CharMatcher

String input = 'Some very stupid data with ids of invoces like 123231/fv/10/2010, 123231/fv/10/2010 and 123231/fv/10/2010';Iterable<String> splitted = Splitter.on(CharMatcher.DIGIT.negate()).trimResults().omitEmptyStrings().split(input);

謂詞/函數

謂詞本身并不多,它只是一個帶有返回true的方法的接口,但是如果將謂詞與函數和Collections2(一個簡化了集合處理的番石榴類)結合使用,則可以在工具箱中找到一個不錯的工具。

但是,讓我們從基本謂詞使用開始。 假設我們要查找是否有用數字登錄的用戶。 接種將是(返回布爾值):

Predicates.in(users).apply(shouldNotHaveDigitsInLoginPredicate);

謂詞看起來像那樣

public class ShouldNotHaveDigitsInLoginPredicate implements Predicate<User> {@Overridepublic boolean apply(User user) {checkNotNull(user);return CharMatcher.DIGIT.retainFrom(user.login).length() == 0;}    
}

現在讓我們添加一個函數,該函數會將用戶轉換為他的全名:

public class FullNameFunction implements Function<User, String> {@Overridepublic String apply(User user) {checkNotNull(user);return user.getFirstName() + ' ' + user.getLastName();}    
}

您可以使用靜態方法轉換調用它:

List<User> users = newArrayList(new User(1L, 'sylwek', 'stall', 'rambo'),new User(2L, 'arnold', 'schwartz', 'commando'));List<String> fullNames = transform(users, new FullNameFunction());

現在,讓謂詞與函數結合使用,以打印登錄名不包含數字的用戶名:

List<User> users = newArrayList(new User(1L, 'sylwek', 'stall', 'rambo'), new User(2L, 'arnold', 'schwartz', 'commando'), new User(3L, 'hans', 'kloss', 'jw23'));Collection<User> usersWithoutDigitsInLogin = filter(users, new ShouldNotHaveDigitsInLoginPredicate());
String names = Joiner.on('\n').join( transform(usersWithoutDigitsInLogin, new FullNameFunction()) );

我們沒有得到的是: 折疊(減少)和元組 。 哦,好吧,如果您想使用Java中的函數 ,您可能還是會轉向Java Functional Library ,對吧?

案例格式

是否曾經想過用一個襯里將這些丑陋的PHP Pear名稱轉換為漂亮的java / cpp樣式? 沒有? 好吧,無論如何,您可以:

String pearPhpName = 'Really_Fucked_Up_PHP_PearConvention_That_Looks_UGLY_because_of_no_NAMESPACES';
String javaAndCPPName = CaseFormat.UPPER_UNDERSCORE.to(CaseFormat.UPPER_CAMEL , pearPhpName);

輸出:ReallyFuckedUpPhpPearconventionThatLooksUglyBecauseOfNoNamespaces

但是,由于Oracle接管了Sun,您實際上可能希望將其轉換為sql風格,對嗎?

String sqlName = CaseFormat.UPPER_CAMEL.to(CaseFormat.LOWER_UNDERSCORE, javaAndCPPName);

輸出:real_fucked_up_php_pearconvention_that_looks_ugly_because_of_no_namespaces

館藏

番石榴具有Google集合庫1.0的超集,這確實是將這種依賴關系包含在pom中的一個很好的理由。 我什至不會嘗試描述所有功能,而只是指出一些不錯的東西:

  • 您幾乎擁有所有東西的不可變版本
  • 您可以在常見類型(如列表,集合,地圖,對象數組)上獲得一些不錯的靜態和靜態類型化方法,這些方法包括:
    • 基于返回類型創建的簡單方法:例如newArrayList
    • 轉換(應用返回不可變版本的函數的方式)
    • 分區(分頁)
    • 逆轉

現在還有更多有趣的收藏。

多圖

Mutlimap基本上是一個映射,單個鍵可以具有許多值。 是否曾經在您的代碼中創建Map <T1,Set <T2 >>? 您不再需要了。

Multimap<Integer, String> multimap = HashMultimap.create();multimap.put(1, 'a');multimap.put(2, 'b');multimap.put(3, 'c');multimap.put(1, 'a2');

當然也有不可變的實現:ImmutableListMultimap,ImmutableSetMultomap等。

您可以在線(最多5個元素)或使用構建器構造不可變項:

Multimap<Integer, String> multimap = ImmutableSetMultimap.of(1, 'a', 2, 'b', 3, 'c', 1, 'a2'); 
Multimap<Integer, String> multimap = new ImmutableSetMultimap.Builder<Integer, String>().put(1, 'a').put(2, 'b').put(3, 'c').put(1, 'a2').build();

雙圖

BiMap是僅具有唯一值的地圖。 考慮一下:

@Test(expected = IllegalArgumentException.class)
public void biMapShouldOnlyHaveUniqueValues() {BiMap<Integer, String> biMap = HashBiMap.create();biMap.put(1, 'a');biMap.put(2, 'b');biMap.put(3, 'a'); //argh! an exception
}

這使您可以反轉地圖,因此值成為關鍵,反之亦然:

BiMap<Integer, String> biMap = HashBiMap.create();
biMap.put(1, 'a');
biMap.put(2, 'b');
biMap.put(3, 'c');BiMap<String, Integer> invertedMap = biMap.inverse();

不知道我實際上想用它做什么。

約束條件

這使您可以在集合上添加約束檢查,以便僅添加通過約束的值。

想象一下,我們想要一個在他們的登錄名中帶有首字母“ r”的用戶集合。

Constraint<User> loginMustStartWithR = new Constraint<User>() {@Overridepublic User checkElement(User user) {checkNotNull(user);if(!user.login.startsWith('r')) {throw new IllegalArgumentException('GTFO, you are not Rrrrrrrrr');}return user;}
};

現在進行測試:

@Test(expected = IllegalArgumentException.class)
public void shouldConstraintCollection() {//givenCollection<User> users = newArrayList(new User(1L, 'john', 'rambo', 'rambo'));Collection<User> usersThatStartWithR = constrainedCollection(users, loginMustStartWithR);//whenusersThatStartWithR.add(new User(2L, 'arnold', 'schwarz', 'commando'));
}

您還可以立即獲得notNull約束:

//notice it's not an IllegalArgumentException :( 
@Test(expected = NullPointerException.class)
public void notNullConstraintShouldWork() {//givenCollection<Integer> users = newArrayList(1);Collection<Integer> notNullCollection = constrainedCollection(users, notNull());//whennotNullCollection.add(null);
}

需要記住的事情:約束條件不是檢查集合中已經存在的數據。

桌子

正如預期的那樣,表是具有列,行和值的集合。 我猜沒有更多的Map <T1,Map <T2,T3 >>。 用法很簡單,您可以轉置:

Table<Integer, String, String> table = HashBasedTable.create();
table.put(1, 'a', '1a');
table.put(1, 'b', '1b');
table.put(2, 'a', '2a');
table.put(2, 'b', '2b');Table transponedTable = Tables.transpose(table);

就是這樣,伙計們。 我沒有介紹util.concurrent,原語,io和net軟件包,但您可能已經知道會發生什么。

祝您編程愉快,別忘了分享!

參考: Solid Craft博客上來自JCG合作伙伴 Jakub Nabrdalik的Google Guava v07示例 。


翻譯自: https://www.javacodegeeks.com/2012/10/google-guava-v07-examples.html

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

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

相關文章

推薦一些經過實踐檢驗的學習方法

作者做了多年的Java培訓教師&#xff0c;也接觸過不少初學者&#xff0c;根據多年的教學互動經驗&#xff0c;總結了一些能少走彎路的學習方法&#xff0c;供大家參考。 第一&#xff0c;是要多學多練&#xff0c;這似乎是廢話&#xff0c;但真正能非常上心學習的人還真是少數&…

使JFrame透明

首先創建一個帶有滑塊的框架&#xff0c;該滑塊將用于設置透明度量。 import javax.swing.JFrame; import javax.swing.JSlider;public class TransparentFrame extends JFrame {public TransparentFrame() {setTitle(Transparent Frame);setSize(400,400);setDefaultCloseOper…

第一次作業之成員介紹

Lab205的新鮮血液 很理所當然的&#xff0c;實驗室的4枚“小鮮肉”在現代軟工的課程上組成了一個team&#xff0c;作為一個負責的team長&#xff0c;我當然要放上組員們的自述啦&#xff01;&#xff08;為什么不是他述&#xff0c;╭(╯^╰)╮&#xff0c;誰讓我是個傲嬌的組長…

java自定義分頁標簽_自定義分頁標簽--仿javaeye分頁效果

效果如圖&#xff1a;1、JSP規范1.1版本后增加了自定義標簽庫。實現自定義標簽的步驟(1)開發自定義標簽處理類。(2)建立*.tld文件。(3)在web.xml中增加自定義標簽的定義。(4)在jsp中使用自定義標簽。2、自定義標簽類(1)繼承javax.servlet.jsp.tagext.TagSupport(2)標簽類屬性&a…

Java隱藏代碼

不久前&#xff0c;我遇到了字符串中不可見字符的問題。 因為它們是不可見的&#xff0c;所以它們確實會引起混亂。 String a "Hello\u200e";String b "Hello\u200f";System.out.println(\ a " and " b " are length " a.length…

201521123052《Java程序設計》第5周學習總結

1. 本周學習總結 1.1 嘗試使用思維導圖總結有關多態與接口的知識點。 1.2 可選&#xff1a;使用常規方法總結其他上課內容。 學習了更多markdown的知識 參考資料: 百度腦圖 XMind 2. 書面作業 作業參考文件下載 1.代碼閱讀&#xff1a;Child壓縮包內源代碼package parent;publi…

Deepin安裝Curl的方法

Deepin安裝Curl的方法 以Deepin為例&#xff0c;只需一條命令即可&#xff1a; sudo apt-get install curl libcurl3 libcurl3-dev php5-curlposted on 2017-09-15 23:22 MissA-VeryGood 閱讀(...) 評論(...) 編輯 收藏 轉載于:https://www.cnblogs.com/MissA-VerGood/p/752911…

亞信聯創java面試題_亞信聯創面試題及答案

1. Vector & ArrayList1) Vector的方法都是同步的(Synchronized),是線程安全的(thread-safe)&#xff0c;而ArrayList的方法不是&#xff0c;由于線程的同步必然要影響性能&#xff0c;因此,ArrayList的性能比Vector好。2) 當Vector或ArrayList中的元素超過它的初始大小時,…

HTTP協議之http狀態碼詳解

什么是HTTP狀態碼 HTTP狀態碼的作用是&#xff1a;Web服務器用來告訴客戶端&#xff0c;發生了什么事。 狀態碼位于HTTP Response 的第一行中&#xff0c;會返回一個”三位數字的狀態碼“和一個“狀態消息”。 ”三位數字的狀態碼“便于程序進行處理&#xff0c; “狀態消息”更…

有用的Ant構建標簽

問題&#xff1a; 如何在ant文件中執行以下任務&#xff1f; 制作zip文件。 運行命令。 將文件復制到遠程計算機。 在遠程Linux機器上運行命令。 打開輸入框并響應輸入值。 撥打螞蟻電話。 答案&#xff1a; 1.制作zip文件&#xff1a; 以下是在ant中制作zip文件的xml…

poj-2955-Brackets-區間DP

poj-2955-Brackets-區間DP BracketsTime Limit: 1000MS Memory Limit: 65536KTotal Submissions: 9014 Accepted: 4829Description We give the following inductive definition of a “regular brackets” sequence: the empty sequence is a regular brackets sequence,if s …

Python調用(運行)外部程序

在Python中可以方便地使用os模塊運行其他的腳本或者程序&#xff0c;這樣就可以在腳本中直接使用其他腳本&#xff0c;或者程序提供的功能&#xff0c;而不必再次編寫實現該功能的代碼。為了更好地控制運行的進程&#xff0c;可以使用win32process模塊中的函數。如果想進一步控…

Java中已檢查和未檢查的異常

Java有兩種類型的異常-已檢查和未檢查。 簡而言之&#xff0c;選中的是指開發人員可以從異常中合理恢復的情況&#xff0c;而未選中的異常是無法處理的編程錯誤。 本文介紹了何時使用哪種。 但這不是那么簡單–受檢查的異常使代碼變得“丑陋”。 它們迫使開發人員編寫try / cat…

CCF - 201403-3 - 命令行選項

問題描述 試題編號&#xff1a;201403-3試題名稱&#xff1a;命令行選項時間限制&#xff1a;1.0s內存限制&#xff1a;256.0MB問題描述&#xff1a; 問題描述請你寫一個命令行分析程序,用以分析給定的命令行里包含哪些選項。每個命令行由若干個字符串組成,它們之間恰好由一個空…

java 枚舉 values_JAVA 枚舉運用一 values方法

importjava.lang.reflect.Method;importjava.lang.reflect.Type;importjava.util.Set;import java.util.*;public classEnumJavaClass {public enumEnumClass{One("參數變量枚舉一"),Two("參數變量枚舉二"),Three("參數變量枚舉三");privateStri…

telnet測試端口是否正常打開

點擊計算機的開始菜單--》運行 &#xff0c;輸入CMD命令&#xff0c;然后確定。打開cmd命令行。 輸入telnet測試端口命令&#xff1a; telnet IP 端口 或者 telnet 域名 端口 回車 如果端口關閉或者無法連接&#xff0c;則顯示不能打開到主機的鏈接&#xff0c;鏈接失敗 端口…

Linux歷史,安裝,分區,版本

Linux 歷史 1970年是 UNIX元年&#xff0c;這一年 Kenneth Lane Thompson 和 Dennis Ritchie 合作編寫了UNIX系統。Stallman 發起了GNU 計劃&#xff0c;他本人開發了Emacs, GCC, GDB.Minix&#xff1a;教學用的類UNIX系統&#xff0c;由于UNIX是收費的且價格昂貴&#xff0c;因…

放棄Eclipse Juno

在上一個博客中&#xff0c;我發布了有關Eclipse 4.2 Juno設置的信息。 萬一我需要重新安裝其他東西&#xff0c;也可以作為參考。 當時我沒有談論的是我與Juno共同遇到的問題。 我以為這是我自己的安裝程序&#xff0c;很麻煩&#xff0c;但是此后并沒有太大改善。 我遇到的主…

Java instead of 用法_我又不是你的誰--java instanceof操作符用法揭秘

背景故事《曾經最美》是朱銘捷演唱的一首歌曲&#xff0c;由陳佳明填詞&#xff0c;葉良俊譜曲&#xff0c;是電視劇《水晶之戀》的主題曲。歌曲時長4分28秒。 歌曲歌詞&#xff1a;看不穿你的眼睛藏有多少悲和喜像冰雪細膩又如此透明仿佛片刻就要老去整個城市的孤寂不止一個你…

3.26

http://codeforces.com/gym/101196/attachments A題 B題 題意&#xff1a;一群人玩桌上足球(>4人)&#xff0c;分成黑白兩隊&#xff0c;每隊有進攻和防守兩名玩家&#xff0c;如果有一方失敗則失敗方的防守坐到等候席的結尾、進攻被流放到防守區再上來一個人作為進攻方。而…