Guava的Collections2:過濾和轉換Java集合

Groovy的便利之一是能夠通過Groovy的閉包支持輕松地對集合執行過濾和轉換操作。 Guava將對集合的過濾和轉換引入標準Java,這是本文的主題。

Guava的Collections2類具有兩個公共方法,這兩個方法都是靜態的。 方法filter(Collection,Predicate)和transform(Collection,Function)的作用含義是:分別對給定的集合執行過濾和轉換。 要過濾或轉換的集合是每個靜態方法的第一個參數。 過濾函數的第二個參數是Guava的Predicate類的實例。 轉換函數的第二個參數是Guava的Function類的實例。 這篇文章的其余部分展示了如何將所有這些結合在一起以過濾和轉換Java集合。

使用番石榴過濾收藏

使用番石榴過濾集合非常簡單。 下面的代碼片段演示了一個簡單的示例。 提供了一個String Set (未在代碼片段中顯示,但在代碼后的輸出中顯而易見),并且僅對以大寫字母“ J”開頭的條目過濾了所提供的Set 。 這是通過使用Java正則表達式支持和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);}

接下來顯示運行上述方法的輸出。 此輸出顯示了構成buildSetStrings()返回的原始String Set的冗長的編程語言列表,并顯示了僅包含以'J'開頭的那些編程語言的過濾器調用的結果。

使用番石榴改變收藏

使用Guava轉換集合類似于語法過濾,但使用Function來指定如何將源集合條目“轉換”為輸出集合,而不是使用Predicate來確定要保留哪些條目。 以下代碼段演示了如何將給定集合中的條目轉換為自身的大寫版本。

將條目轉換為大寫

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

上面的轉換代碼片段使用了一個名為UpperCaseFunction的類,但是在Guava API文檔中找不到該類。 這是一個自定義類,如下面的代碼清單所示。

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

接下來顯示運行使用UpperCaseFunction類的轉換代碼段的輸出。

上面的代碼段顯示了專用于使用Guava過濾和轉換集合條目的方法。 接下來顯示主要類的完整代碼清單。

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

在結束本文之前,這里需要注意一個重要的注意事項。 在Collections2類上定義的這兩種方法在其Javadoc文檔中均包含有關其使用的警告。 兩種方法都提供了被視為原始集合“實時視圖”的集合,因此“對一個集合的更改會影響另一個集合”。 例如,從源集合中刪除元素類似地將其從轉換后的集合中刪除。 每個方法的文檔還警告即使源集合是可序列化的和/或線程安全的,也不會返回可序列化或線程安全的集合。

結論

Guava使使用Java過濾集合和轉換集合條目變得更加容易。 盡管執行類似操作的代碼可能不如Groovy簡潔,但是它比不使用Guava的Collections2類編寫直接Java代碼要好。 Java集合可以使用Collections2.filter(Collection,Predicate)進行過濾,也可以使用Collections2.transform(Collection,Function)

參考:在Inspired by Actual Events博客上,我們的JCG合作伙伴 Dustin Marx 用Guava的Collections2過濾和轉換Java集合 。

翻譯自: https://www.javacodegeeks.com/2012/11/guavas-collections2-filtering-and-transforming-java-collections.html

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

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

相關文章

釘釘機器人怎么設置自動回復_項目部署成功后觸發釘釘機器人發送消息提醒——入門配置...

釘釘建好一個群打開群設置, 找到群機器人添加一個你想要的機器人可以使用自定義自定義機器人可以自定義頭像,名字,生成一個webhook(https post的請求地址)到這里, 釘釘機器人設置好了,接下來我們對照文檔進行配置https://ding-doc.dingtalk.com/doc#/serverapi2/qf2nxq/XAzBI -…

mysql加鎖語法_MySql 加鎖問題

1、設置非自動提交 set autocommit0; 這時候 for update才會起作用2、一般用法 set autocommit0; for update(加鎖) ; commit/rollback; set autocommit1;首先看一下&#xff0c;set autocommit0 后&#xff0c;執行哪些語句會自動加鎖&#xff0c;加的是什么鎖&#xff1f…

td過長,將固定寬度table撐開

解決辦法&#xff1a; 在table上加上樣式: table{table-layout:fixed;word-break:break-all} table-layout:fixed tablle的列寬由表格寬度和列寬設定。 word-break:break-all 允許在單詞內換行。 正常情況下&#xff1a; table表格中td過長&#xff1a; 加上樣式之后&#…

Spring Boot 之注解@Component @ConfigurationProperties(prefix = sms)

從spring-boot開始&#xff0c;已經支持yml文件形式的配置&#xff0c;ConfigurationProperties的大致作用就是通過它可以把properties或者yml配置直接轉成對象 例如&#xff1a; 配置文件: sms.urlXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX sms.appkeyXXXXXXXXXXXXXXXXXXXXXXXXXXXXX …

Java臨時緩存API –測試早期草案評審RI

它被稱為“ 永無止境的故事 ”。 JSR在11年半前開始運作&#xff0c;并于2001年3月6日通過了JSR 評審投票 。 如果您想知道要獲得成千上萬個低JSR編號需要什么&#xff0c;那就是秘密。 與邁克爾恩德&#xff08;Michael Ende&#xff09;的德國幻想小說不同&#xff0c;這不是…

Android幾秒后自動關閉dialog

代碼改變世界 Android幾秒后自動關閉dialog AlertDialog.Builder builder new AlertDialog.Builder(v.getContext());builder.setTitle("發送成功&#xff01;");builder.setMessage("2秒后自動關閉&#xff01;");builder.setCancelable(true);final Ale…

如何獲取注解中的值_如何在運行時利用注解信息

注解&#xff08; annontation &#xff09;是 Java 1.5 之后引入的一個為程序添加元數據的功能。注解本身并不是魔法&#xff0c;只是在代碼里添加了描述代碼自身的信息&#xff0c;至于如何理解和使用這些信息&#xff0c;則需要專門的解析代碼來負責。本文首先介紹注解的基本…

mysql5.7運行按鈕_MySQL 5.7.* 啟動問題

mysql-5.7.10-winx64啟動 mysqld.exe&#xff0c;報錯&#xff1a;mysqld: Could not create or access the registry key needed for the MySQL applicationto log to the Windows EventLog. Run the application with sufficientprivileges once to create the key, add the …

控制元素的div屬性

1、需求分析 改變元素的寬、高、顏色、顯示、重置等屬性。 2、技術分析 基礎的css、html、js 3、詳細分析 如圖&#xff0c;單擊按鈕&#xff0c;改變元素屬性: 3.1 HTML部分 根據視圖不難發現&#xff0c;內容分兩大不分:按鈕欄和效果圖&#xff0c;所以設置兩個div。 <…

使用JMeter和Yourkit進行REST / HTTP服務的性能分析

我的上一篇文章描述了如何使用JMeter完成異步REST / HTTP服務的壓力測試或負載測試。 但是&#xff0c;運行這樣的測試通常表明被測系統不能很好地應對不斷增加的負載。 現在的問題是如何找到瓶頸&#xff1f; 深入研究代碼以檢測可疑部分可能是另一種選擇。 但是考慮到潛在的…

EasyUI 加載時需要顯示和隱藏 panel(面板)內容破版問題

1.當頁面加載的完成時,如果面板中的內容是未加載的如果把他的狀態從隱藏變為顯示會導致破版,頁面信息顯示不全 2.這時需要刷新面板$(#id).panel(open).panel(refresh); 3.它就會重新加載轉載于:https://www.cnblogs.com/eagle-xie/p/6892706.html

java中間件_90%的Java程序員,都扛不住這波消息中間件的面試四連炮!

概述大家平時也有用到一些消息中間件(MQ)&#xff0c;但是對其理解可能僅停留在會使用API能實現生產消息、消費消息就完事了。對MQ更加深入的問題&#xff0c;可能很多人沒怎么思考過。比如&#xff0c;你跳槽面試時&#xff0c;如果面試官看到你簡歷上寫了&#xff0c;熟練掌握…

python 取array并集_Python內置數據結構原理與性能簡易分析

ins ngladc文末左下方閱讀原文指向了本人博客鏈接&#xff0c;不含廣告。參考資料中的相關鏈接&#xff0c;可以在博客文章的最下方獲取。推薦蘋果手機用戶使用淺色模式觀看。前言 對于一些算法題&#xff0c;可以使用Python自帶的內置函數解決。但很多時候用就用了&#xff0c…

ae合成復制腳本_稀缺資源—這幾個AE腳本使用頻率很高,趕緊收藏吧!

「第442期」毫無疑問&#xff0c;AE已經成為目前制作短視頻比較主流的軟件&#xff0c;效果的多樣化深受很多創作者的喜愛。隨著對軟件的熟悉&#xff0c;越發覺得AE主要是基于多圖層控制的軟件。如果制作一些簡單的效果&#xff0c;幾個圖層幾個濾鏡就可以搞定&#xff0c;但如…

android activity and fragment活動周期

1.狀態 /* 每個活動一共有四種狀態 *&#xff1a;1。運行狀態&#xff0c;就是棧頂的那個 * 2。暫停狀態&#xff1a;就是不處于棧頂&#xff0c;但是依然可見&#xff0c;比如對話框下面的界面 * 3。停止狀態&#xff1a;不處于棧頂&#xff0c;并且不可見 * 4。銷毀狀態 * */…

html css基礎知識

1 這是自己學習html時候做的一些記錄&#xff0c;供大家參考 <!--2 塊和內聯3 塊元素:獨占一行的元素4 div p h ul5 div沒有任何語義&#xff0c;就是一個純粹的快元素6 就是為了方便布局7 …

番石榴的ListenableFuture

Guava中的ListenableFuture試圖為Future對象定義一致的API&#xff0c;以注冊完成回調。 通過在Future完成時添加回調的功能&#xff0c;我們可以異步有效地響應傳入的事件。 如果您的應用程序與許多將來的對象高度并發&#xff0c;我強烈建議您盡可能使用ListenableFuture 。 …

程序員的幸福感和頸椎病

脖子一直疼&#xff01; 去醫院檢查&#xff0c;拍片子的醫生在造影室里沖我喊&#xff1a; “小伙子&#xff0c;你多大年紀啦&#xff1f;” 我說&#xff1a;“我三十來歲&#xff0c;咋啦” 醫生說&#xff1a;“怎么這么年輕就得這種病啊&#xff01;” 我當時腿就有點軟&…

python實現詞語相似度計算分析_相似度計算的方法及Python實現

現實生活中&#xff0c;我們經常提到距離這個詞&#xff0c;本文談的相似度就是基于距離定義的&#xff0c;當兩個向量之間的距離特別小時&#xff0c;就說這倆個向量相似度高&#xff0c;反之相似度不高。所以&#xff0c;衡量相似度的指標就是距離度量。經常使用的相似度計算…

poll函數_I/O復用 - 三組I/O復用函數的比較

在之前的文章中 I/O復用 - epoll 和 I/O復用 - select&poll 中我們討論了三組I/O復用的系統調用&#xff0c;這3組系統調用都能同時監聽多個文件描述符。它們將等待由timeout參數指定的超時時間&#xff0c;直到一個或多個文件描述符上有事件發生時返回&#xff0c;返回值是…