中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Java8如何處理集合

發布時間:2021-08-17 10:43:36 來源:億速云 閱讀:156 作者:小新 欄目:編程語言

這篇文章主要為大家展示了“Java8如何處理集合”,內容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領大家一起研究并學習一下“Java8如何處理集合”這篇文章吧。

1.Stream介紹

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

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

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

Stream有以下特性及優點:

  • 無存儲。Stream不是一種數據結構,它只是某種數據源的一個視圖,數據源可以是一個數組,Java容器或I/O channel等。

  • 為函數式編程而生。對Stream的任何修改都不會修改背后的數據源,比如對Stream執行過濾操作并不會刪除被過濾的元素,而是會產生一個不包含被過濾元素的新Stream。

  • 惰式執行。Stream上的操作并不會立即執行,只有等到用戶真正需要結果的時候才會執行。

  • 可消費性。Stream只能被“消費”一次,一旦遍歷過就會失效,就像容器的迭代器那樣,想要再次遍歷必須重新生成。

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

Java8如何處理集合

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

如上圖,對于流的處理,主要有三種關鍵性操作:分別是流的創建、中間操作(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如何處理集合

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

Java8如何處理集合

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如何處理集合

4.Stream最終操作

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

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

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

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

常用的最終操作如下圖:

Java8如何處理集合

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如何處理集合

以上是“Java8如何處理集合”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

咸阳市| 鄂尔多斯市| 嘉义市| 革吉县| 上杭县| 界首市| 大余县| 瓦房店市| 新疆| 北票市| 噶尔县| 绥棱县| 千阳县| 大庆市| 永城市| 两当县| 芦溪县| 固始县| 石门县| 丰都县| 香格里拉县| 蕲春县| 雷山县| 贡嘎县| 威远县| 芦山县| 津市市| 襄城县| 芜湖县| 睢宁县| 滦南县| 云阳县| 肇东市| 绥江县| 东莞市| 克什克腾旗| 肥西县| 崇左市| 高邮市| 姚安县| 锡林郭勒盟|