如今,在功能上大肆宣傳,因此至少在Java集合方面,我將簡要介紹一下其中的功能。 我個人喜歡標準
集合API,但在某些情況下可能會很尷尬并添加其他詳細信息。 在Java 8+的更高版本中,這應該不是問題。 在那里,我們可能會擔心不會創建回調地獄,但嘿,對于大多數內容來說,沒有萬靈藥,為什么要為編程編寫一個?
番石榴之路
Guava項目是Google的核心庫之一,其中涵蓋了許多不同的核心語言方面和問題。 有日常使用的實用程序和擴展,例如:集合,基元,緩存,通用批注,字符串處理,I / O,數學,反射等。 我們只會看一下Collections的好東西,所以讓我們看看其中的一些:
// listImmutableList<String> of =ImmutableList.of("a", "b", "c", "d");// Same one for mapImmutableMap<String, String> map =ImmutableMap.of("key1", "value1", "key2", "value2");//list of intsList<Integer> theList = Ints.asList(1, 2, 3, 4, 522, 5, 6);
Guava集合與JDK集合兼容,因為它們主要擴展或實現標準類。 API中有幾個很酷的實用程序,它們的名稱與java.util.Collections中的名稱相似。 基本上,任何了解JDK集合的程序員都應該能夠輕松地轉移到Guava。 用于List的那些稱為Lists ,用于Set的一個稱為Sets,用于Map的一個叫Maps ,其余的依次類推。 例如:
//create new List
List<someLongName> list = Lists.newArrayList();
//create new LinkedHashMap
Map<someKeyType, SomeValueType> map = Maps.newLinkedHashMap();//initalize Array List on the spot
List<String> someList = Lists.newArrayList("one", "two", "three");//set inital size for readability as well as performance
List<Type> exactly100 = Lists.newArrayListWithCapacity(100);
List<Type> approx100 = Lists.newArrayListWithExpectedSize(100);
對應于特定界面的方法以非常直觀的方式進行分組。 還有一些非常好的構建具有各種功能的緩存的方法:
Cache<Integer, Customer> cache = CacheBuilder.newBuilder().weakKeys().maximumSize(10000).expireAfterWrite(10, TimeUnit.MINUTES).build(new CacheLoader<Integer, Customer>() {@Overridepublic Customer load(Integer key) throws Exception {return retreveCustomerForKey(key);}});
由于Guava在大多數Maven存儲庫中都可用,因此很容易將其添加到構建中
蘭伯達
該項目背后的想法是以一種功能性和靜態類型的方式來操縱集合。 這是通過避免重復通常用集合執行的簡單任務來實現的。 重復使程序員可以復制/粘貼,并通過創建來創建bug。 在沒有顯式循環的情況下訪問集合提供了一種過濾,排序,提取,分組,轉換,調用每個項目上的方法或匯總集合中這些元素的元素或字段的方法。 除了所有這些功能之外,lambdaj還是DSL,因為它在語法中添加了非常酷的“糖”功能,使其在偽英語中更具可讀性。 這是通過靜態方法完成的,因此為了使用它們,我們直接將它們包括在內:
import static ch.lambdaj.Lambda.*;
在檢查和匹配方面,lambdaj高度依賴Hamcrest匹配器。 因此,例如,創建一個奇數整數檢查,然后使用該檢查過濾列表:
Matcher<Integer> odd = new Predicate<Integer>() {public boolean apply(Integer item) {return item % 2 == 1;}
};
List<Integer> oddNumbers = filter(odd, asList(1, 2, 3, 4, 5));
并按預期該列表將返回列表[1,3,5]。 Lambdaj在DSL方面走得更遠,例如:
List<Beneficiary> beneficiaries = with(transactions).retain(having(on(Transaction.class).getQunatity(), lessThan(100))).extract(on(Transaction.class).getBeneficiary()).sort(on(Beneficiary.class).getName());
績效成本
盡管使應用程序快速運行的最佳方法是擁有盡可能最干凈的代碼,但是有時您必須進行優化。為此,創建者提供了一些有關內存使用和時間的信息。 Lambdaj有一個性能Wiki頁面,其中包含代碼示例。 其他程序員也進行了一些測試,例如,他們將 lambdaj與JDK8進行了比較 。 關于番石榴的內存使用情況也有一些衡量標準。 至于Guava的性能,大多數功能是標準的JDK類構建器和實用程序,因此開銷很小。 歸根結底,由您決定這些庫中的每一個對您的項目有多大影響,以及這是否有積極意義。 我的想法是,幾乎每個項目的類路徑上都必須包含Guava。
相關鏈接摘要
- 番石榴http://code.google.com/p/guava-libraries/
- lambdaj http://code.google.com/p/lambdaj/
- Hamcrest http://hamcrest.org/
- 番石榴鏈接http://www.tfnico.com/presentations/google-guava
- 番石榴例子https://github.com/mitemitreski/guava-examples
- 番石榴演示文稿http://blog.mitemitreski.com/2012/07/google-guava-for-cleaner-code.html
參考: Java Advent Calendar博客中來自JCG合作伙伴 Mite Mitresky的功能Java集合 。
翻譯自: https://www.javacodegeeks.com/2012/12/functional-java-collections.html