最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時間:2019年03月11日 11:16:30   作者:Hollis  
這篇文章主要給大家介紹了關(guān)于Java8優(yōu)雅處理集合之Stream的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學(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的性能及原理不是本文的重點,如果大家感興趣后面會出文章單獨介紹。

1.Stream介紹

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

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

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

Stream有以下特性及優(yōu)點:

  • 無存儲。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í)行。
  • 可消費性。Stream只能被“消費”一次,一旦遍歷過就會失效,就像容器的迭代器那樣,想要再次遍歷必須重新生成。

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

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

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

2.Stream的創(chuàng)建

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

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

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

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類提供的方法,直接返回一個由指定元素組成的流。

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

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

3.Stream中間操作

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

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

filter

filter 方法用于通過設(shè)置的條件過濾出元素。以下代碼片段使用 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 方法用于映射每個元素到對應(yīng)的結(jié)果,以下代碼片段使用 map 輸出了元素對應(yīng)的平方數(shù):

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 

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

代碼如下:

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é)果如下圖:

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

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

常用的最終操作如下圖:

forEach

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

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

count

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

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

collect

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

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é)果。

5.總結(jié)

本文介紹了Java 8中的Stream 的用途,優(yōu)點等。還接受了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í)價值,謝謝大家對腳本之家的支持。

相關(guān)文章

  • Maven熱部署devtools的實現(xiàn)示例

    Maven熱部署devtools的實現(xiàn)示例

    本文主要介紹了Maven熱部署devtools的實現(xiàn)示例,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-07-07
  • 詳解Java中的線程池

    詳解Java中的線程池

    這篇文章主要介紹了Java中的線程池,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-03-03
  • Spring Boot日志控制詳解

    Spring Boot日志控制詳解

    這篇文章主要為大家詳細介紹了Spring Boot日志控制的相關(guān)資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-11-11
  • Java基礎(chǔ)篇之反射機制詳解

    Java基礎(chǔ)篇之反射機制詳解

    本文詳細講解了Java基礎(chǔ)篇之反射機制,文中通過示例代碼介紹的非常詳細。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-01-01
  • 解決Spring Cloud中Feign/Ribbon第一次請求失敗的方法

    解決Spring Cloud中Feign/Ribbon第一次請求失敗的方法

    這篇文章主要給大家介紹了關(guān)于解決Spring Cloud中Feign/Ribbon第一次請求失敗的方法,文中給出了三種解決的方法,大家可以根據(jù)需要選擇對應(yīng)的方法,需要的朋友們下面來一起看看吧。
    2017-02-02
  • Spring boot開發(fā)web應(yīng)用JPA過程解析

    Spring boot開發(fā)web應(yīng)用JPA過程解析

    這篇文章主要介紹了Spring boot開發(fā)web應(yīng)用JPA過程解析,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-09-09
  • 辨析Java中的String與StringBuffer及StringBuilder字符串類

    辨析Java中的String與StringBuffer及StringBuilder字符串類

    這里將為大家來辨析Java中的String與StringBuffer及StringBuilder字符串類型,通常來說StringBuilder的性能更加,需要的朋友可以參考下
    2016-05-05
  • Java四個線程常用函數(shù)超全使用詳解

    Java四個線程常用函數(shù)超全使用詳解

    這篇文章主要為大家介紹了線程中常用的四個函數(shù):wait()、join()、sleep() 和 yield(),以及這四個函數(shù)的使用方法和相互之間的區(qū)別,需要的可以參考一下
    2022-03-03
  • Java中Switch的使用方法及新特性

    Java中Switch的使用方法及新特性

    在java中控制流程語句是由選擇語句、循環(huán)語句、跳轉(zhuǎn)語句構(gòu)成,選擇語句包括if和switch,在過多的使用if語句嵌套會使程序很難閱讀,這時就可以用到switch語句,這篇文章主要給大家介紹了關(guān)于Java中Switch的使用方法及新特性的相關(guān)資料,需要的朋友可以參考下
    2023-11-11
  • Spring bean為什么需要依賴注入

    Spring bean為什么需要依賴注入

    本篇文章主要介紹了Spring依賴注入的三種方式小結(jié),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2021-07-07

最新評論

咸宁市| 新津县| 彩票| 郯城县| 临漳县| 包头市| 招远市| 白玉县| 托克逊县| 石城县| 高淳县| 房产| 海淀区| 故城县| 保山市| 寿光市| 栾城县| 江孜县| 南阳市| 贵溪市| 台安县| 太保市| 景谷| 连山| 孟村| 庄浪县| 芦山县| 龙井市| 灵台县| 道孚县| 迁西县| 宁化县| 岳池县| 镇沅| 鄄城县| 双城市| 原阳县| 韩城市| 兰考县| 鄂托克旗| 南阳市|