日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

成为Java流专家–第2部分:中级操作

發(fā)布時間:2023/12/3 java 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 成为Java流专家–第2部分:中级操作 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

就像魔術(shù)棒一樣,中間操作將一個Stream轉(zhuǎn)換為另一個Stream。 這些操作可以無窮無盡的方式組合在一起,以可讀有效的方式執(zhí)行從簡單到高度復(fù)雜的任務(wù)。

本文是五分之二,其中還有一個GitHub存儲庫,其中包含每個單元的說明和練習(xí)。

  • 第1部分:創(chuàng)建流
  • 第2部分:中級操作
  • 第三部分:終端操作
  • 第4部分:數(shù)據(jù)庫流
  • 第5部分:使用流創(chuàng)建數(shù)據(jù)庫應(yīng)用程序

中級業(yè)務(wù)

中間操作充當應(yīng)如何轉(zhuǎn)換Stream元素的聲明性(功能性)描述,它們共同構(gòu)成了元素流經(jīng)的管道。 該行結(jié)尾的內(nèi)容自然取決于管道的設(shè)計方式。

與機械流水線相反,Stream流水線中的中間操作可能(*)呈現(xiàn)新的Stream,該流可能取決于先前階段中的元素。 對于map操作(我們將在稍后介紹),新的Stream甚至可能包含其他類型的元素。

(*)嚴格來說,不要求執(zhí)行中間操作來創(chuàng)建新的Stream。 相反,它可以更新其內(nèi)部狀態(tài),或者,如果中間操作未進行任何更改(例如.skip(0) ),則返回上一級的現(xiàn)有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]

現(xiàn)在,我們將繼續(xù)詳細解釋這些操作和其他操作的含義。

根據(jù)我們的經(jīng)驗, filter()是Stream API最有用的操作之一。 它使您可以將Stream縮小為適合特定條件的元素。 此類標準必須表示為Predicate (導(dǎo)致boolean值的函數(shù)),例如lambda。 以下代碼的目的是查找以字母“ L”開頭的字符串,并丟棄其他字符串。

Stream<String> startsWithT = Stream.of( "Monkey" , "Lion" , "Giraffe" , "Lemur" ) .filter(s -> s.startsWith( "L" )); startsWithT: [Lion, Lemur]

有一些非常簡單但功能強大的操作,提供了一種根據(jù)元素在Stream中的位置選擇或丟棄元素的方法。 這些操作中的第一個是limit(n) ,它基本上按照其說的進行操作–它創(chuàng)建一個新流,該流僅包含應(yīng)用該流的前n個元素。 下面的示例說明了如何將四只動物的流簡化為僅“猴子”和“獅子”。

Stream<String> firstTwo = Stream.of( "Monkey" , "Lion" , "Giraffe" , "Lemur" ) .limit( 2 ); firstTwo: [Monkey, Lion]


同樣,如果只對線下的某些元素感興趣,則可以使用.skip(n) -operation。 如果將skip(2)應(yīng)用于動物流,則會留下尾巴兩個元素“長頸鹿”和“狐猴”。

Stream<String> firstTwo = Stream.of( "Monkey" , "Lion" , "Giraffe" , "Lemur" ) .skip( 2 ); lastTwo: [Giraffe, Lemur]

在某些情況下,流中每個元素只需要出現(xiàn)一次即可。 無需手動篩選出任何重復(fù)項,而是為此目的存在了一個指定的操作-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]


有時只能以自然順序排序可能會有些局限。 幸運的是,可以應(yīng)用自定義Comparator來檢查元素的某些屬性。 例如,我們可以按照字符串的長度順序?qū)λ鼈冞M行排序:

Stream<String> lengthOrder = Stream.of( "Monkey" , "Lion" , "Giraffe" , "Lemur" ) .sorted(Comparator.comparing(String::length)); lengthOrder: [Lion, Lemur, Monkey, Giraffe]

我們可以應(yīng)用于Stream的最通用的操作之一是map() 。 通過將Stream的元素映射到另一個值或類型,它可以將其轉(zhuǎn)換為其他元素。 這意味著此操作的結(jié)果可以是任何類型R的Stream。 下面的示例執(zhí)行從String到String的簡單映射,將所有大寫字母替換為它們的小寫字母。

Stream<String> lowerCase = Stream.of( "Monkey" , "Lion" , "Giraffe" , "Lemur" ) .map(String::toLowerCase); lowerCase: [monkey, lion, giraffe, lemur]


map-operation的三種特殊實現(xiàn)方式僅限于將元素映射到基本類型int , double和double
long 。

.mapToInt(); .mapToDouble(); .mapToLong();

因此,這些操作的結(jié)果始終對應(yīng)于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() 。 我們更喜歡前一種表示法,因為它使代碼更簡潔易讀。


盡管本文功能非常強大,但我們將很難理解它的最后一項操作。 它是有關(guān)map()操作,但是,而不是采取一個Function ,其從型變?yōu)門到返回類型R它需要一個Function ,其從型變?yōu)門并返回一個Stream的R 。 然后將這些“內(nèi)部”流平展為生成的流,從而將內(nèi)部流的所有元素串聯(lián)在一起。

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]


如果您尚未克隆關(guān)聯(lián)的GitHub存儲庫,我們建議您現(xiàn)在進行克隆。 本文的內(nèi)容足以解決名為MyUnit2Intermediate的第二個單元。 相應(yīng)的Unit2Intermediate接口包含JavaDocs,它們描述MyUnit2MyIntermediate方法的預(yù)期實現(xiàn)。

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 )將充當自動分級工具,讓您知道您的解決方案是否正確。

下一篇

在下一篇文章中,我們將繼續(xù)進行終端操作,并探索如何收集,計數(shù)或分組管道的結(jié)果元素。 在此之前–祝您編程愉快!

s

Per Minborg和Julia Gustafsson

翻譯自: https://www.javacodegeeks.com/2019/10/become-a-master-of-java-streams-part-2-intermediate-operations.html

總結(jié)

以上是生活随笔為你收集整理的成为Java流专家–第2部分:中级操作的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。