亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > Java > 正文

Java8處理集合的優雅姿勢之Stream

2024-07-14 08:43:49
字體:
來源:轉載
供稿:網友

前言

在Java中,集合和數組是我們經常會用到的數據結構,需要經常對他們做增、刪、改、查、聚合、統計、過濾等操作。相比之下,關系型數據庫中也同樣有這些操作,但是在Java 8之前,集合和數組的處理并不是很便捷。

不過,這一問題在Java 8中得到了改善,Java 8 API添加了一個新的抽象稱為流Stream,可以讓你以一種聲明的方式處理數據。本文就來介紹下如何使用Stream。特別說明一下,關于Stream的性能及原理不是本文的重點,如果大家感興趣后面會出文章單獨介紹。

1.Stream介紹

Stream 使用一種類似用 SQL 語句從數據庫查詢數據的直觀方式來提供一種對 Java 集合運算和表達的高階抽象。

Stream API可以極大提高Java程序員的生產力,讓程序員寫出高效率、干凈、簡潔的代碼。

這種風格將要處理的元素集合看作一種流,流在管道中傳輸,并且可以在管道的節點上進行處理,比如篩選,排序,聚合等。

Stream有以下特性及優點:

  • 無存儲。Stream不是一種數據結構,它只是某種數據源的一個視圖,數據源可以是一個數組,Java容器或I/O channel等。
  • 為函數式編程而生。對Stream的任何修改都不會修改背后的數據源,比如對Stream執行過濾操作并不會刪除被過濾的元素,而是會產生一個不包含被過濾元素的新Stream。
  • 惰式執行。Stream上的操作并不會立即執行,只有等到用戶真正需要結果的時候才會執行。
  • 可消費性。Stream只能被“消費”一次,一旦遍歷過就會失效,就像容器的迭代器那樣,想要再次遍歷必須重新生成。

我們舉一個例子,來看一下到底Stream可以做什么事情:

Java8,Stream

上面的例子中,獲取一些帶顏色塑料球作為數據源,首先過濾掉紅色的、把它們融化成隨機的三角形。再過濾器并刪除小的三角形。最后計算出剩余圖形的周長。

如上圖,對于流的處理,主要有三種關鍵性操作:分別是流的創建、中間操作(intermediate operation)以及最終操作(terminal operation)。

2.Stream的創建

在Java 8中,可以有多種方法來創建流。

1、通過已有的集合來創建流

在Java 8中,除了增加了很多Stream相關的類以外,還對集合類自身做了增強,在其中增加了stream方法,可以將一個集合類轉換成流。

List<String> strings = Arrays.asList("Hollis", "HollisChuang", "hollis", "Hello", "HelloWorld", "Hollis"); Stream<String> stream = strings.stream(); 

以上,通過一個已有的List創建一個流。除此以外,還有一個parallelStream方法,可以為集合創建一個并行流。

這種通過集合創建出一個Stream的方式也是比較常用的一種方式。

2、通過Stream創建流

可以使用Stream類提供的方法,直接返回一個由指定元素組成的流。

Stream<String> stream = Stream.of("Hollis", "HollisChuang", "hollis", "Hello", "HelloWorld", "Hollis"); 

如以上代碼,直接通過of方法,創建并返回一個Stream。

3.Stream中間操作

Stream有很多中間操作,多個中間操作可以連接起來形成一個流水線,每一個中間操作就像流水線上的一個工人,每人工人都可以對流進行加工,加工后得到的結果還是一個流。

Java8,Stream

以下是常用的中間操作列表:

Java8,Stream

filter

filter 方法用于通過設置的條件過濾出元素。以下代碼片段使用 filter 方法過濾掉空字符串:

List<String> strings = Arrays.asList("Hollis", "", "HollisChuang", "H", "hollis"); strings.stream().filter(string -> !string.isEmpty()).forEach(System.out::println); //Hollis, , HollisChuang, H, hollis 

map

map 方法用于映射每個元素到對應的結果,以下代碼片段使用 map 輸出了元素對應的平方數:

List<Integer> numbers = Arrays.asList(3, 2, 2, 3, 7, 3, 5); numbers.stream().map( i -> i*i).forEach(System.out::println); //9,4,4,9,49,9,25 

limit/skip

limit 返回 Stream 的前面 n 個元素;skip 則是扔掉前 n 個元素。以下代碼片段使用 limit 方法保理4個元素:

List<Integer> numbers = Arrays.asList(3, 2, 2, 3, 7, 3, 5); numbers.stream().limit(4).forEach(System.out::println); //3,2,2,3 

sorted

sorted 方法用于對流進行排序。以下代碼片段使用 sorted 方法進行排序:

List<Integer> numbers = Arrays.asList(3, 2, 2, 3, 7, 3, 5); numbers.stream().sorted().forEach(System.out::println); //2,2,3,3,3,5,7 

distinct

distinct主要用來去重,以下代碼片段使用 distinct 對元素進行去重:

List<Integer> numbers = Arrays.asList(3, 2, 2, 3, 7, 3, 5); numbers.stream().distinct().forEach(System.out::println); //3,2,7,5 

接下來我們通過一個例子和一張圖,來演示下,當一個Stream先后通過filter、map、sort、limit以及distinct處理后會發生什么。

代碼如下:

List<String> strings = Arrays.asList("Hollis", "HollisChuang", "hollis", "Hello", "HelloWorld", "Hollis"); Stream s = strings.stream().filter(string -> string.length()<= 6).map(String::length).sorted().limit(3)    .distinct(); 

過程及每一步得到的結果如下圖:

Java8,Stream

4.Stream最終操作

Stream的中間操作得到的結果還是一個Stream,那么如何把一個Stream轉換成我們需要的類型呢?比如計算出流中元素的個數、將流裝換成集合等。這就需要最終操作(terminal operation)

最終操作會消耗流,產生一個最終結果。也就是說,在最終操作之后,不能再次使用流,也不能在使用任何中間操作,否則將拋出異常:

java.lang.IllegalStateException: stream has already been operated upon or closed 

俗話說,“你永遠不會兩次踏入同一條河”也正是這個意思。

常用的最終操作如下圖:

Java8,Stream

forEach

Stream 提供了方法 'forEach' 來迭代流中的每個數據。以下代碼片段使用 forEach 輸出了10個隨機數:

Random random = new Random(); random.ints().limit(10).forEach(System.out::println); 

count

count用來統計流中的元素個數。

List<String> strings = Arrays.asList("Hollis", "HollisChuang", "hollis","Hollis666", "Hello", "HelloWorld", "Hollis"); System.out.println(strings.stream().count()); //7 

collect

collect就是一個歸約操作,可以接受各種做法作為參數,將流中的元素累積成一個匯總結果:

List<String> strings = Arrays.asList("Hollis", "HollisChuang", "hollis","Hollis666", "Hello", "HelloWorld", "Hollis"); strings = strings.stream().filter(string -> string.startsWith("Hollis")).collect(Collectors.toList()); System.out.println(strings); //Hollis, HollisChuang, Hollis666, Hollis 

接下來,我們還是使用一張圖,來演示下,前文的例子中,當一個Stream先后通過filter、map、sort、limit以及distinct處理后會,在分別使用不同的最終操作可以得到怎樣的結果。

下圖,展示了文中介紹的所有操作的位置、輸入、輸出以及使用一個案例展示了其結果。

Java8,Stream

5.總結

本文介紹了Java 8中的Stream 的用途,優點等。還接受了Stream的幾種用法,分別是Stream創建、中間操作和最終操作。

Stream的創建有兩種方式,分別是通過集合類的stream方法、通過Stream的of方法。

Stream的中間操作可以用來處理Stream,中間操作的輸入和輸出都是Stream,中間操作可以是過濾、轉換、排序等。

Stream的最終操作可以將Stream轉成其他形式,如計算出流中元素的個數、將流裝換成集合、以及元素的遍歷等。

好了,以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對VeVb武林網的支持。


注:相關教程知識閱讀請移步到JAVA教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日韩麻豆第一页| 欧美乱大交xxxxx| 中文字幕日韩av电影| 亚洲最新视频在线| 国产欧美一区二区三区视频| 午夜精品一区二区三区在线| 2019亚洲男人天堂| 欧美久久精品一级黑人c片| 国产精品爽黄69天堂a| 亚洲精品久久久久久久久久久久| 欧美午夜片欧美片在线观看| 久久久久亚洲精品国产| 欧美国产日韩一区二区| 国产一区二区三区四区福利| 欧美人交a欧美精品| 国产在线高清精品| 黑人巨大精品欧美一区二区免费| 国产亚洲精品成人av久久ww| 国产日韩av在线| 91精品国产91久久久久福利| 91精品久久久久久久久久另类| 日韩av片永久免费网站| 91久久久久久久| 高清视频欧美一级| 国产一区二区欧美日韩| 欧美在线视频网站| 国产不卡一区二区在线播放| 国产精品九九九| 韩日精品中文字幕| 欧美亚洲伦理www| 国产香蕉97碰碰久久人人| 亚洲欧洲午夜一线一品| 亚洲精品suv精品一区二区| 2021国产精品视频| 国产精品亚发布| 成人激情视频网| 欧美高跟鞋交xxxxxhd| 欧美综合激情网| 亚洲片在线资源| 亚洲成人a级网| 久久精品国产视频| 亚洲视频自拍偷拍| 欧美日韩精品在线| 亚洲xxxxx| 精品激情国产视频| 亚洲偷欧美偷国内偷| 欧美在线观看日本一区| 亚洲午夜未删减在线观看| 日韩网站免费观看| 日韩美女主播视频| 久久99国产精品久久久久久久久| 国产深夜精品福利| 国产成人精品久久二区二区| 成人激情视频小说免费下载| 成人看片人aa| 成人黄色短视频在线观看| 91视频免费网站| 精品一区电影国产| 一个色综合导航| 国产亚洲精品美女久久久久| 亚洲一级片在线看| 国产精品高潮呻吟久久av黑人| 国产91精品黑色丝袜高跟鞋| 日本精品免费观看| 亚洲国产美女精品久久久久∴| 日韩精品久久久久久福利| 美女999久久久精品视频| 亚洲精品欧美日韩专区| 亚洲欧美国产高清va在线播| 日韩极品精品视频免费观看| 九九热在线精品视频| 国产精品直播网红| 日韩av电影在线网| 中文字幕日韩av综合精品| 奇门遁甲1982国语版免费观看高清| 91精品国产九九九久久久亚洲| 久久中文字幕一区| 欧美猛男性生活免费| 国产精品自产拍在线观看中文| 亚洲男人的天堂网站| 欧美亚洲第一区| 国产精品999999| 国产精品第七十二页| 欧美在线视频一区二区| 欧美成在线视频| 国产精品高潮粉嫩av| 国产日产欧美精品| 亚洲国产欧美一区| 久久久免费在线观看| 亚洲精品自拍偷拍| 伊人久久大香线蕉av一区二区| 九九久久国产精品| 成人国产精品久久久久久亚洲| 视频一区视频二区国产精品| 综合欧美国产视频二区| 亚洲在线观看视频| 国产精品免费久久久| 久久成人国产精品| 在线观看不卡av| 国产日韩在线看| 亚洲免费福利视频| 亚洲性线免费观看视频成熟| 日韩网站免费观看| 亚洲人成77777在线观看网| 狠狠爱在线视频一区| 热门国产精品亚洲第一区在线| 国产高清视频一区三区| 亚洲欧美日本精品| 国产精品视频一区国模私拍| 2019中文字幕在线免费观看| 欧美激情一区二区三区成人| 日韩成人av在线播放| 38少妇精品导航| 欧美日韩亚洲高清| 亚洲视频电影图片偷拍一区| 国产精品白丝jk喷水视频一区| 91在线观看免费高清完整版在线观看| 久久成人人人人精品欧| 色无极亚洲影院| 亚洲国产古装精品网站| 91在线高清视频| 亚洲r级在线观看| 国产亚洲激情视频在线| 欧美交受高潮1| 日韩美女视频免费看| 亚洲性视频网址| 国产欧美一区二区三区在线看| 国产亚洲精品美女久久久久| 国产精品久久久久久久电影| 日韩av免费在线看| 欧美激情视频在线免费观看 欧美视频免费一| 97香蕉久久超级碰碰高清版| 国产成人福利夜色影视| 中文国产亚洲喷潮| 日韩在线观看精品| 热门国产精品亚洲第一区在线| 亚洲国产精品va在看黑人| 97婷婷大伊香蕉精品视频| 色综合色综合久久综合频道88| 久久免费高清视频| 日韩av在线一区| 国产欧美精品一区二区| 亚洲电影免费观看高清完整版| 久热爱精品视频线路一| 日韩女优在线播放| 精品亚洲一区二区| 国内成人精品视频| 精品一区电影国产| 成人性生交大片免费看小说| 日韩av在线电影网| 亚洲aⅴ男人的天堂在线观看| 精品夜色国产国偷在线| 一区二区三区黄色| 久久久91精品国产| 草民午夜欧美限制a级福利片| 操91在线视频| 日韩成人小视频| 久久视频国产精品免费视频在线| 国产欧美一区二区三区久久| 成人亚洲欧美一区二区三区| 日韩av免费看网站| 一色桃子一区二区| 亚洲区中文字幕| 性欧美在线看片a免费观看|