java –cp ./:_成为Java流专家–第2部分:中级操作
java –cp ./:
就像魔術棒一樣,中間操作將一個Stream轉換為另一個Stream。 這些操作可以無窮無盡的方式組合在一起,以可讀有效的方式執行從簡單到高度復雜的任務。
本文是五分之二,其中還有一個GitHub存儲庫,其中包含每個單元的說明和練習。
- 第1部分:創建流
- 第2部分:中級操作
- 第三部分:終端操作
- 第4部分:數據庫流
- 第5部分:使用流創建數據庫應用程序
中級業務
中間操作充當應如何轉換Stream元素的聲明性(功能性)描述,它們共同構成了元素流經的管道。 該行結尾的內容自然取決于管道的設計方式。
與機械流水線相反,Stream流水線中的中間操作可能(*)呈現新的Stream,該流可能依賴于先前階段中的元素。 對于map操作(我們將在稍后介紹),新的Stream甚至可能包含不同類型的元素。
(*)嚴格來說,不要求執行中間操作來創建新的Stream。 相反,它可以更新其內部狀態,或者,如果中間操作未更改任何內容(例如.skip(0) ),則返回上一級的現有Stream。
要了解管道的外觀,請回想一下上一篇文章中使用的示例:
List<String> list = Stream.of( "Monkey" , "Lion" , "Giraffe" , "Lemur" ) .filter(s -> s.startsWith( "L" )) .map(String::toUpperCase) .sorted() .collect(toList()); System.out.println(list); [LEMUR, LION]現在,我們將繼續詳細解釋這些操作和其他操作的含義。
根據我們的經驗, filter()是Stream API最有用的操作之一。 它使您可以將Stream縮小為適合特定條件的元素。 此類標準必須表示為Predicate (導致boolean值的函數),例如lambda。 以下代碼的目的是查找以字母“ L”開頭的字符串,并丟棄其他字符串。
Stream<String> startsWithT = Stream.of( "Monkey" , "Lion" , "Giraffe" , "Lemur" ) .filter(s -> s.startsWith( "L" )); startsWithT: [Lion, Lemur]有一些非常簡單但功能強大的操作,提供了一種基于元素在Stream中的位置來選擇或丟棄元素的方法。 這些操作中的第一個是limit(n) ,它基本上按照其說的進行操作–它創建一個新流,該流僅包含要應用的流的前n個元素。 下面的示例說明了如何將四個動物的流簡化為僅“猴子”和“獅子”。
Stream<String> firstTwo = Stream.of( "Monkey" , "Lion" , "Giraffe" , "Lemur" ) .limit( 2 ); firstTwo: [Monkey, Lion]類似地,如果我們只對線下的某些元素感興趣,則可以使用.skip(n) -operation。 如果將skip(2)應用于動物流,則會留下尾巴兩個元素“長頸鹿”和“狐猴”。
Stream<String> firstTwo = Stream.of( "Monkey" , "Lion" , "Giraffe" , "Lemur" ) .skip( 2 ); lastTwo: [Giraffe, Lemur]在某些情況下,流中每個元素只需要出現一次即可。 無需手動篩選出任何重復項,而是為此目的存在了一個指定的操作–distinct distinct() 。 它將使用Object::equals檢查是否相等,并返回僅包含唯一元素的新Stream。 這類似于集合。
Stream<String> uniqueAnimals = Stream.of( "Monkey" , "Lion" , "Giraffe" , "Lemur" , "Lion" ) .distinct(); uniqueAnimals: [“Monkey”, “Lion”, “Giraffe”, “Lemur”]有時元素的順序很重要,在這種情況下,我們希望控制事物的排序方式。 最簡單的方法是使用排序操作,該操作將以自然順序排列元素。 對于下面的字符串,這表示字母順序。
Stream<String> alphabeticOrder = Stream.of( "Monkey" , "Lion" , "Giraffe" , "Lemur" ) .sorted(); alphabeticOrder: [Giraffe, Lemur, Lion, Monkey]有時只能以自然順序排序可能會有些局限。 幸運的是,可以應用自定義Comparator來檢查元素的某些屬性。 例如,我們可以按照字符串的長度順序對它們進行排序:
Stream<String> lengthOrder = Stream.of( "Monkey" , "Lion" , "Giraffe" , "Lemur" ) .sorted(Comparator.comparing(String::length)); lengthOrder: [Lion, Lemur, Monkey, Giraffe]我們可以應用于Stream的最通用的操作之一是map() 。 通過將Stream的元素映射到另一個值或類型,它可以將其轉換為其他元素。 這意味著此操作的結果可以是任何類型R的Stream。 下面的示例執行從String到String的簡單映射,將所有大寫字母替換為它們的小寫字母。
Stream<String> lowerCase = Stream.of( "Monkey" , "Lion" , "Giraffe" , "Lemur" ) .map(String::toLowerCase); lowerCase: [monkey, lion, giraffe, lemur] 映射操作還有三種特殊的實現方式,它們僅限于將元素映射到基本類型int , double和double
long 。
因此,這些操作的結果始終對應于IntStream , DoubleStream或LongStream 。 下面,我們演示如何使用.mapToInt()將動物映射到其名稱的長度:
IntStream lengths = Stream.of( "Monkey" , "Lion" , "Giraffe" , "Lemur" ) .mapToInt(String::length); lengths: [ 6 , 4 , 7 , 5 ] 注意:
String::length等于lambda s -> s.length() 。 我們更喜歡前一種表示法,因為它使代碼更簡潔易讀。
盡管本文功能非常強大,但我們將很難理解它的最后一項操作。 它是有關map()操作,但是,而不是采取一個Function ,其從型變為T到返回類型R它需要一個Function ,其從型變為T并返回一個Stream的R 。 然后將這些“內部”流平展為生成的流,從而將內部流的所有元素串聯在一起。
Stream<Character> chars = Stream.of( "Monkey" , "Lion" , "Giraffe" , "Lemur" ) .flatMap(s -> s.chars().mapToObj(i -> ( char ) i)); chars: [M, o, n, k, e, y, L, i, o, n, G, i, r, a, f, f, e, L, e, m, u, r]如果您尚未克隆關聯的GitHub存儲庫,我們建議您現在進行克隆。 本文的內容足以解決名為MyUnit2Intermediate的第二個單元。 相應的Unit2Intermediate接口包含JavaDocs,它們描述MyUnit2MyIntermediate方法的預期實現。
public interface Unit2Intermediate { /** * Return a Stream that contains words that are * longer than three characters. Shorter words * (ie words of length 0, 1, 2 and 3) * shall be filtered away from the stream. * <p> * A Stream of * ["The", "quick", "quick", "brown", "fox", * "jumps", "over", "the", "lazy", "dog"] * would produce a Stream of the elements * ["quick", "quick", "brown", "jumps", * "over", "lazy"] */ Stream<String> wordsLongerThanThreeChars(Stream<String> stream);提供的測試(例如Unit2MyIntermediateTest )將充當自動分級工具,讓您知道您的解決方案是否正確。
下一篇
在下一篇文章中,我們將繼續進行終端操作,并探索如何收集,計數或分組管道的結果元素。 在此之前–祝您編程愉快!
s
Per Minborg和Julia Gustafsson
翻譯自: https://www.javacodegeeks.com/2019/10/become-a-master-of-java-streams-part-2-intermediate-operations.html
java –cp ./:
總結
以上是生活随笔為你收集整理的java –cp ./:_成为Java流专家–第2部分:中级操作的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 不同分段电脑人技能也不一样不同分段电脑人
- 下一篇: java 字符数组与字符串_用于字符串和