Groovy的便利之一是能夠通過Groovy的閉包支持輕松地對(duì)集合執(zhí)行過濾和轉(zhuǎn)換操作。 Guava將對(duì)集合的過濾和轉(zhuǎn)換引入標(biāo)準(zhǔn)Java,這是本文的主題。
Guava的Collections2類具有兩個(gè)公共方法,這兩個(gè)方法都是靜態(tài)的。 方法filter(Collection,Predicate)和transform(Collection,Function)的作用含義是:分別對(duì)給定的集合執(zhí)行過濾和轉(zhuǎn)換。 要過濾或轉(zhuǎn)換的集合是每個(gè)靜態(tài)方法的第一個(gè)參數(shù)。 過濾函數(shù)的第二個(gè)參數(shù)是Guava的Predicate類的實(shí)例。 轉(zhuǎn)換函數(shù)的第二個(gè)參數(shù)是Guava的Function類的實(shí)例。 這篇文章的其余部分展示了如何將所有這些結(jié)合在一起以過濾和轉(zhuǎn)換Java集合。
使用番石榴過濾收藏
使用番石榴過濾集合非常簡單。 下面的代碼片段演示了一個(gè)簡單的示例。 提供了一個(gè)String Set (未在代碼片段中顯示,但在代碼后的輸出中顯而易見),并且僅對(duì)以大寫字母“ J”開頭的條目過濾了所提供的Set 。 這是通過使用Java正則表達(dá)式支持和Guava的Predicates.containsPattern(String)來完成的 ,但是還可以指定其他類型的Predicate 。
過濾以'J'開頭的字符串
/*** Demonstrate Guava's Collections2.filter method. Filter String beginning * with letter 'J'.*/public static void demonstrateFilter(){printHeader('Collections2.filter(Collection,Predicate): 'J' Languages');final Set<String> strings = buildSetStrings();out.println('\nOriginal Strings (pre-filter):\n\t' + strings);final Collection<String> filteredStrings =Collections2.filter(strings, Predicates.containsPattern('^J'));out.println('\nFiltered Strings:\n\t' + filteredStrings);out.println('\nOriginal Strings (post-filter):\n\t' + strings);}
接下來顯示運(yùn)行上述方法的輸出。 此輸出顯示了構(gòu)成buildSetStrings()返回的原始String Set的冗長的編程語言列表,并顯示了僅包含以'J'開頭的那些編程語言的過濾器調(diào)用的結(jié)果。
使用番石榴改變收藏
使用Guava轉(zhuǎn)換集合類似于語法過濾,但使用Function來指定如何將源集合條目“轉(zhuǎn)換”為輸出集合,而不是使用Predicate來確定要保留哪些條目。 以下代碼段演示了如何將給定集合中的條目轉(zhuǎn)換為自身的大寫版本。
將條目轉(zhuǎn)換為大寫
/*** Demonstrate Guava's Collections2.transform method. Transform input* collection's entries to uppercase form.*/public static void demonstrateTransform(){printHeader('Collections2.transform(Collection,Function): Uppercase');final Set<String> strings = buildSetStrings();out.println('\nOriginal Strings (pre-transform):\n\t' + strings);final Collection<String> transformedStrings = Collections2.transform(strings, new UpperCaseFunction<String, String>());out.println('\nTransformed Strings:\n\t' + transformedStrings);out.println('\nOriginal Strings (post-transform):\n\t' + strings);}
上面的轉(zhuǎn)換代碼片段使用了一個(gè)名為UpperCaseFunction的類,但是在Guava API文檔中找不到該類。 這是一個(gè)自定義類,如下面的代碼清單所示。
UpperCaseFunction.java
package dustin.examples;import com.google.common.base.Function;/*** Simple Guava Function that converts provided object's toString() representation* to upper case.* * @author Dustin*/
public class UpperCaseFunction<F, T> implements Function<F, T>
{@Overridepublic Object apply(Object f){return f.toString().toUpperCase();}
}
接下來顯示運(yùn)行使用UpperCaseFunction類的轉(zhuǎn)換代碼段的輸出。
上面的代碼段顯示了專用于使用Guava過濾和轉(zhuǎn)換集合條目的方法。 接下來顯示主要類的完整代碼清單。
GuavaCollections2.java
package dustin.examples;import static java.lang.System.out;import com.google.common.base.Predicates;
import com.google.common.collect.Collections2;
import java.util.Collection;
import java.util.HashSet;
import java.util.Set;/*** Class whose sole reason for existence is to demonstrate Guava's Collections2* class.* * @author Dustin*/
public class GuavaCollections2
{/*** Provides a Set of Strings.* * @return Set of strings representing some programming languages.*/private static Set<String> buildSetStrings(){final Set<String> strings = new HashSet<String>();strings.add('Java');strings.add('Groovy');strings.add('Jython');strings.add('JRuby');strings.add('Python');strings.add('Ruby');strings.add('Perl');strings.add('C');strings.add('C++');strings.add('C#');strings.add('Pascal');strings.add('Fortran');strings.add('Cobol');strings.add('Scala');strings.add('Clojure');strings.add('Basic');strings.add('PHP');strings.add('Flex/ActionScript');strings.add('JOVIAL');return strings;}/*** Demonstrate Guava's Collections2.filter method. Filter String beginning * with letter 'J'.*/public static void demonstrateFilter(){printHeader('Collections2.filter(Collection,Predicate): 'J' Languages');final Set<String> strings = buildSetStrings();out.println('\nOriginal Strings (pre-filter):\n\t' + strings);final Collection<String> filteredStrings =Collections2.filter(strings, Predicates.containsPattern('^J'));out.println('\nFiltered Strings:\n\t' + filteredStrings);out.println('\nOriginal Strings (post-filter):\n\t' + strings);}/*** Demonstrate Guava's Collections2.transform method. Transform input* collection's entries to uppercase form.*/public static void demonstrateTransform(){printHeader('Collections2.transform(Collection,Function): Uppercase');final Set<String> strings = buildSetStrings();out.println('\nOriginal Strings (pre-transform):\n\t' + strings);final Collection<String> transformedStrings = Collections2.transform(strings, new UpperCaseFunction<String, String>());out.println('\nTransformed Strings:\n\t' + transformedStrings);out.println('\nOriginal Strings (post-transform):\n\t' + strings);}/*** Print a separation header including the provided text.* * @param headerText Text to be included in separation header.*/private static void printHeader(final String headerText){out.println('\n==========================================================');out.println('== ' + headerText);out.println('==========================================================');}/*** Main function for demonstrating Guava's Collections2 class.* * @param arguments */public static void main(final String[] arguments){demonstrateFilter();demonstrateTransform();}
}
在結(jié)束本文之前,這里需要注意一個(gè)重要的注意事項(xiàng)。 在Collections2類上定義的這兩種方法在其Javadoc文檔中均包含有關(guān)其使用的警告。 兩種方法都提供了被視為原始集合“實(shí)時(shí)視圖”的集合,因此“對(duì)一個(gè)集合的更改會(huì)影響另一個(gè)集合”。 例如,從源集合中刪除元素類似地將其從轉(zhuǎn)換后的集合中刪除。 每個(gè)方法的文檔還警告即使源集合是可序列化的和/或線程安全的,也不會(huì)返回可序列化或線程安全的集合。
結(jié)論
Guava使使用Java過濾集合和轉(zhuǎn)換集合條目變得更加容易。 盡管執(zhí)行類似操作的代碼可能不如Groovy簡潔,但是它比不使用Guava的Collections2類編寫直接Java代碼要好。 Java集合可以使用Collections2.filter(Collection,Predicate)進(jìn)行過濾,也可以使用Collections2.transform(Collection,Function) 。
參考:在Inspired by Actual Events博客上,我們的JCG合作伙伴 Dustin Marx 用Guava的Collections2過濾和轉(zhuǎn)換Java集合 。
翻譯自: https://www.javacodegeeks.com/2012/11/guavas-collections2-filtering-and-transforming-java-collections.html
總結(jié)
以上是生活随笔為你收集整理的Guava的Collections2:过滤和转换Java集合的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。