Java 8过滤器,地图,收集和流示例
大家好,許多讀者給我發了電子郵件,寫了一篇有關Java 8的地圖和過濾器功能的文章,因為他們發現它們難以理解和使用。 即使我以前同時寫過有關map()和filter()的博客,我仍在寫這篇文章,以更多的外行語言來解釋該概念,以更好地理解我的讀者和Java開發人員。
map()函數是Stream類中的一種方法,表示一種功能編程概念。 簡而言之, map()用于通過應用function將一個對象轉換為另一個對象 。
這就是Stream.map(Function mapper)將函數作為參數的原因。 例如,通過使用map()函數,可以通過將Integer.valueOf()方法應用于輸入列表中的每個String,將String列表轉換為Integer列表。
您只需要一個映射函數即可將一個對象轉換為另一個對象,而map()函數將為您完成轉換。
這也是中間流操作,這意味著您可以調用其他Stream方法(例如過濾器)或對此進行收集以創建轉換鏈。
現在,按照其名稱暗示的那樣,使用filter方法, 它會根據您提供給您的條件來過濾元素 。 例如,如果您的列表中包含數字,而您只想要偶數,則可以使用過濾器方法選擇唯一可被二整除的數字。
過濾方法實質上是根據您提供的條件選擇元素。 這就是filter(Predicate condition)接受提供應用條件功能的Predicate對象的原因。 如果條件評估為true,則選擇對象,否則將其忽略。
與map相似,過濾器也是中間操作,這意味著您可以在調用過濾器后調用其他Stream方法。
filter()方法也是惰性的 ,這意味著它只有在調用諸如collect這樣的簡化方法時才會被評估,并且一旦到達目標就將停止。
1.如何在Java 8中使用地圖和過濾器
您需要一個很好的例子來理解新概念,這就是您閱讀本文的原因。 由于String和Integer是Java中最常見的數據類型,因此我選擇了一個既簡單又有趣的示例。
我有一個String列表,它是數字,例如{"1", "2", "3", "4", "5", "6"}我想處理此列表,并且需要另一個帶有偶數的Integer列表數字 。
為了找到偶數,我首先需要將String列表轉換為Integer列表,為此,我可以使用java.util.Stream類的map()方法,但是在此之前,我們需要將Stream作為map()在java.util.stream中定義。 流類。
但是,這一點都不困難,因為您可以通過調用stream()方法從任何Collection(例如List或Set)中獲取流,因為它是在java.util.Collection接口中定義的。
map(Function mapper)方法采用一個Function ,從技術上講是java.util.function.Function interface一個對象。 然后將此函數應用于Stream的每個元素,以轉換為所需的類型。
由于我們需要將String轉換為Integer,因此可以將Integer.parseInt()或Integer.valueOf()方法傳遞給map()函數。 我之所以選擇valueOf()方法,是因為我在parseInt與valueOf文章中提到的原因,即性能和緩存。
然后map()將返回一個包含偶數和奇數的整數流。 要只選擇偶數,我們可以使用filter()方法。 它需要一個Predicate對象,從技術上講,它是將對象轉換為boolean的函數 。 我的意思是我們傳遞了一個對象,它將返回true或false。 過濾器使用該信息將對象包括在結果流中。
因此,為了只包括偶數,我們將其稱為filter( number -> number%2==0) ,這意味著每個數字將被零除,如果沒有余數,則將其選中。
我們差不多完成了,但是到目前為止,我們只有偶數的Stream而不是偶數的List,這就是為什么我們需要使用collect()方法的原因,該方法將Stream的元素收集到指定的Collection中。
由于我們需要列表,因此我調用了collect(Collectors.toList()) ,它將把所有偶數累加到List中并返回。 現在您可能正在考慮如何知道要返回的Integer列表,它很好地通過類型推斷來獲取該信息,因為我們已經通過將結果存儲到List<Integer> 。
2. Java 8 Map +過濾器+收集示例
這是Java程序,用于實現我在上一節中所說的內容。 您可以在IDE中或從命令行運行此程序,然后查看結果。 您還可以嘗試使用更多的map()函數或更多的filter()調用來使合成更長,更復雜。 您甚至可以使用collect()方法將結果收集到列表,集合,地圖或任何其他集合中。
package tool;import java.util.Arrays; import java.util.List; import java.util.stream.Collectors;/*** * A simple Java Program to demonstrate how to use map and filter method Java 8.* In this program, we'll convert a list of String into a list of Integer and* then filter all even numbers.*/ public class Hello {public static void main(String[] args) {List<String> numbers = Arrays.asList("1", "2", "3", "4", "5", "6");System.out.println("original list: " + numbers);List<Integer> even = numbers.stream().map(s -> Integer.valueOf(s)).filter(number -> number % 2 == 0).collect(Collectors.toList());System.out.println("processed list, only even numbers: " + even);}}Output original list: [1, 2, 3, 4, 5, 6] the processed list, only even numbers: [2, 4, 6]您可以看到原始列表包含從1到6的數字,而過濾后的列表僅包含偶數,即2、4和6。
此示例中最重要的代碼是以下4行Stream處理代碼:
此代碼首先繪制地圖,然后過濾并最終收集。 您可能想知道訂單是否重要,是否確實如此。 由于我們的過濾條件需要一個int變量,因此我們首先需要將String 流轉換為Integer流 ,這就是為什么我們首先調用map()函數的原因。
一旦獲得整數流,就可以應用數學找出偶數,然后將該條件傳遞給filter方法。
如果我們需要對String進行過濾,例如選擇所有length > 2字符串,那么我們將在map之前調用filter。
這就是如何在Java 8中使用map和filter的全部內容。 我們已經看到了一個有趣的示例,說明如何使用地圖將對象轉換為另一個對象,并根據條件進行過濾以選擇對象。 我們還學習了如何在流上編寫操作以編寫清晰明了的代碼。
感謝您到目前為止閱讀本教程。 如果您喜歡這個Java 8 map +過濾器示例和我的解釋,請與您的朋友和同事分享。 如果您有任何疑問或反饋,請留言。
翻譯自: https://www.javacodegeeks.com/2018/05/java-8-filter-map-collect-stream-example.html
總結
以上是生活随笔為你收集整理的Java 8过滤器,地图,收集和流示例的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 开源软件加密授权方案_身份验证和授权作为
- 下一篇: linux 程序开机自启动三种方法(li