国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術(shù)|正則表達(dá)式|C/C++|IOS|C#|Swift|Android|JavaScript|易語言|

服務(wù)器之家 - 編程語言 - Java教程 - Java8處理集合的優(yōu)雅姿勢之Stream

Java8處理集合的優(yōu)雅姿勢之Stream

2021-07-20 16:32Hollis Java教程

這篇文章主要給大家介紹了關(guān)于Java8優(yōu)雅處理集合之Stream的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者使用java8具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧

前言

在java中,集合和數(shù)組是我們經(jīng)常會用到的數(shù)據(jù)結(jié)構(gòu),需要經(jīng)常對他們做增、刪、改、查、聚合、統(tǒng)計、過濾等操作。相比之下,關(guān)系型數(shù)據(jù)庫中也同樣有這些操作,但是在java 8之前,集合和數(shù)組的處理并不是很便捷。

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

1.stream介紹

stream 使用一種類似用 sql 語句從數(shù)據(jù)庫查詢數(shù)據(jù)的直觀方式來提供一種對 java 集合運(yùn)算和表達(dá)的高階抽象。

stream api可以極大提高java程序員的生產(chǎn)力,讓程序員寫出高效率、干凈、簡潔的代碼。

這種風(fēng)格將要處理的元素集合看作一種流,流在管道中傳輸,并且可以在管道的節(jié)點(diǎn)上進(jìn)行處理,比如篩選,排序,聚合等。

stream有以下特性及優(yōu)點(diǎn):

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

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

Java8處理集合的優(yōu)雅姿勢之Stream

上面的例子中,獲取一些帶顏色塑料球作為數(shù)據(jù)源,首先過濾掉紅色的、把它們?nèi)诨呻S機(jī)的三角形。再過濾器并刪除小的三角形。最后計算出剩余圖形的周長。

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

2.stream的創(chuàng)建

在java 8中,可以有多種方法來創(chuàng)建流。

1、通過已有的集合來創(chuàng)建流

在java 8中,除了增加了很多stream相關(guān)的類以外,還對集合類自身做了增強(qiáng),在其中增加了stream方法,可以將一個集合類轉(zhuǎn)換成流。

?
1
2
list<string> strings = arrays.aslist("hollis", "hollischuang", "hollis", "hello", "helloworld", "hollis");
stream<string> stream = strings.stream();

以上,通過一個已有的list創(chuàng)建一個流。除此以外,還有一個parallelstream方法,可以為集合創(chuàng)建一個并行流。

這種通過集合創(chuàng)建出一個stream的方式也是比較常用的一種方式。

2、通過stream創(chuàng)建流

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

?
1
stream<string> stream = stream.of("hollis", "hollischuang", "hollis", "hello", "helloworld", "hollis");

如以上代碼,直接通過of方法,創(chuàng)建并返回一個stream。

3.stream中間操作

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

Java8處理集合的優(yōu)雅姿勢之Stream

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

Java8處理集合的優(yōu)雅姿勢之Stream

filter

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

?
1
2
3
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 方法用于映射每個元素到對應(yīng)的結(jié)果,以下代碼片段使用 map 輸出了元素對應(yīng)的平方數(shù):

?
1
2
3
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個元素:

?
1
2
3
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 方法用于對流進(jìn)行排序。以下代碼片段使用 sorted 方法進(jìn)行排序:

?
1
2
3
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 對元素進(jìn)行去重:

?
1
2
3
list<integer> numbers = arrays.aslist(3, 2, 2, 3, 7, 3, 5);
numbers.stream().distinct().foreach(system.out::println);
//3,2,7,5

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

代碼如下:

?
1
2
3
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();

過程及每一步得到的結(jié)果如下圖:

Java8處理集合的優(yōu)雅姿勢之Stream

4.stream最終操作

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

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

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

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

常用的最終操作如下圖:

Java8處理集合的優(yōu)雅姿勢之Stream

foreach

stream 提供了方法 'foreach' 來迭代流中的每個數(shù)據(jù)。以下代碼片段使用 foreach 輸出了10個隨機(jī)數(shù):

?
1
2
random random = new random();
random.ints().limit(10).foreach(system.out::println);

count

count用來統(tǒng)計流中的元素個數(shù)。

?
1
2
3
list<string> strings = arrays.aslist("hollis", "hollischuang", "hollis","hollis666", "hello", "helloworld", "hollis");
system.out.println(strings.stream().count());
//7

collect

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

?
1
2
3
4
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

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

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

Java8處理集合的優(yōu)雅姿勢之Stream

5.總結(jié)

本文介紹了java 8中的stream 的用途,優(yōu)點(diǎn)等。還接受了stream的幾種用法,分別是stream創(chuàng)建、中間操作和最終操作。

stream的創(chuàng)建有兩種方式,分別是通過集合類的stream方法、通過stream的of方法。

stream的中間操作可以用來處理stream,中間操作的輸入和輸出都是stream,中間操作可以是過濾、轉(zhuǎn)換、排序等。

stream的最終操作可以將stream轉(zhuǎn)成其他形式,如計算出流中元素的個數(shù)、將流裝換成集合、以及元素的遍歷等。

好了,以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,謝謝大家對服務(wù)器之家的支持。

原文鏈接:http://zhuanlan.51cto.com/art/201903/593119.htm

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 日韩在线成人 | 国产一级视频 | 免费av大全 | 欧美日韩久 | 中文在线播放 | 免费看国产黄色 | 韩国一区二区视频 | 日韩中文字幕在线 | 草草成人| 亚洲成人久久久 | 亚洲人人看 | 99国产精品99久久久久久 | 美国特级a毛片免费网站 | 人人澡人人爽 | 欧美性猛交xxxx黑人猛交 | 久久久一二三 | 欧美黄色电影在线 | 国产成人在线电影 | 91免费在线 | 欧美黄色一区二区 | 精品无码久久久久国产 | 你懂的免费在线观看 | 日韩精品久久久 | 国产精品综合视频 | 国产精品久久久久久久 | 三a视频| 日韩欧美在线播放 | 无码日韩精品一区二区免费 | 亚洲视频在线看 | 亚洲一区二区三区四区的 | 狠狠色综合网站久久久久久久 | 99视频在线免费观看 | 成人狠狠色综合 | 国产精品国产 | 精品国产三级 | √天堂8在线网 | 久久av一区二区三区亚洲 | 男人的天堂中文字幕 | 中文在线视频 | 日韩一二三区 | 亚洲国产精品一区二区第一页 |