成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專欄INFORMATION COLUMN

Java 8之stream進階

Jaden / 2697人閱讀

摘要:獲取每個元素的字符串長度放入新流中,然后轉(zhuǎn)為類型。歸約歸約就是把整個流歸約成一個值的操作,比如求集合中最大的元素所有元素值的和之類的操作。

前言:

上一篇文章 Java 8之stream介紹和使用 中講解了stream的定義和用法,簡單介紹幾個最基本最常用的方法,其實stream還有更強大的功能,這篇文章就會給大家介紹stream的進階用法。

篩選:

在上一篇文章中我們介紹了使用filter方法來篩選元素,filter方法接受一個Predicate類型的參數(shù),我們可以傳入一個Lamada表達式或者方法引用,原理在 Java 8之方法引用和Lambda表達式 中已經(jīng)將結(jié)果。我們實際上是傳入了一個條件,然后篩選出符合條件的元素,例如下面的這行代碼就是篩選出年齡大于20的人。

List list = peoples.stream().filter(person -> person.getAge()>20).collect(toList());

實際上stream還有別的方法可以進行篩選,下面我們來介紹幾個常用的。

distinct,這個方法可以幫助我們?nèi)ブ?/p>

List numbers = Arrays.asList(1, 2, 1, 3, 3, 2, 4);
numbers.stream().filter(i -> i % 2 == 0).distinct().forEach(System.out::println);

limit,這個方法可以讓我們只取stream中的前幾個,值得注意的是當(dāng)我們用Set集合來存儲元素時,因為Set是無序的,所以每次我們?nèi)〉降那皫讉€元素也會是無序的。

List numbers = Arrays.asList(1, 2, 1, 3, 3, 2, 4);
numbers.stream().limit(3).forEach(System.out::println);

skip,這個方法可以讓我們跳過元素,跳過多少個元素由我們指定。

List numbers = Arrays.asList(1, 2, 1, 3, 3, 2, 4);
numbers.stream().skip(3).forEach(System.out::println);

映射:

我們經(jīng)常遇到從對象中抽取自己需要的元素放入一個新的類型的集合中的情況,這就是映射操作,而stream在這方面也提供了非常強大的支持。

map,這個方法接受一個Lambda表達式,它會遍歷整個流把這個函數(shù)作用到每個元素上,然后把輸出的結(jié)果放到一個新流中。

// 獲取每個元素的name屬性放入一個新流中,然后把這個流轉(zhuǎn)為List類型。
List names = peoples.stream().map(Person::getName).collect(toList());
// 獲取每個元素的字符串長度放入新流中,然后轉(zhuǎn)為List類型。
List words = Arrays.asList("AA", "B", "CCC", "DDDDDD");
List wordLengths = words.stream().map(String::length).collect(toList());

flatmap,這個方法比較特殊,它的作用是把多個相同類型的流連成一個流,我們看下面的代碼,目的是為了把集合中的字符串都拆成單個字符然后放到一個集合,但是如果直接用map方法的話返回的ListString[]類型的,這是因為word.split("")返回的結(jié)果就是這個類型的。

List words = Arrays.asList("Hello", "world");
List list = words.stream().map(word -> word.split("")).collect(toList());

在這里要提到Arrays.stream()這個方法,它的作用是接受一個數(shù)組,然后把這個數(shù)組里的元素轉(zhuǎn)為一個流,所以我們可以嘗試使用這個方法來改進下上面的代碼。但是我們發(fā)現(xiàn)還是有問題,返回集合類型是Stream,因為map(Arrays::stream)把數(shù)組里的每個元素都弄成了一個流。

List words = Arrays.asList("Hello", "world");
List> list = words.stream().map(word -> word.split(""))
    .map(Arrays::stream).collect(toList());

現(xiàn)在flatmap的作用就出來了,我們把代碼改進下,改成使用flatmap接受Arrays::stream,它的作用正是在上面map(Arrays::stream)的基礎(chǔ)上把集合里的流里面的元素合并成一個流,所以返回的List類型就是String類型的。

List words = Arrays.asList("Hello", "world");
List list = words.stream().map(word -> word.split(""))
    .flatmap(Arrays::stream).collect(toList());

匹配:

stream同樣也提供了很多方法來檢查集合中是否包含了某個指定的值。注意,這些方法都屬于 終端操作 ,也就是說調(diào)用了這些方法就會關(guān)閉流。

allMatch

List numbers = Arrays.asList("Hello", "World");
boolean flag = numbers.stream().allMatch(string -> string.contains("z"));
System.out.println(flag);

anyMatch,這個方法會檢查流中是否至少有一個元素匹配給定的值,返回一個boolean值。

List numbers = Arrays.asList("Hello", "World");
boolean flag = numbers.stream().anyMatch(string -> string.contains("z"));
System.out.println(flag);

noneMatch,這個方法則是和allMatch方法做相反的操作。

List numbers = Arrays.asList("Hello", "World");
boolean flag = numbers.stream().noneMatch(string -> string.contains("z"));
System.out.println(flag);

查找:

對于集合的操作最重要的就是從中查找符合條件的數(shù)據(jù)了,我們來看下面的方法。

findAny,這個方法需要配合filter方法使用,返回把篩選出來的第一個元素。注意,這里返回的是Optional類型的對象,這個對象是Java 8新增的專門為了防止返回數(shù)據(jù)的時候遇到null的情況,后續(xù)再作詳細了解,目前只需要知道它有個isPresent方法來判斷元素是否為空,get方法用來取值。

List numbers = Arrays.asList("Hello", "World");
Optional optional= numbers.stream().filter(string -> string.contains("l")).findAny();
if(optional.isPresent()){
    System.out.println(optional.get());
}

findFirst,這個方法是用來取流中第一個元素的,目前看來好像沒什么用,但是有時候我們可能會對流進行復(fù)雜的篩選,再選取篩選后的流中第一個元素。

List numbers = Arrays.asList("Hello", "World");
Optional optional= numbers.stream().findFirst();
System.out.println(optional.toString());

歸約:

歸約就是把整個流歸約成一個值的操作,比如求集合中最大的元素、所有元素值的和之類的操作。

reduce,這個方法就是用來對元素的值進行操作的,我們這里做加法運算。它接受兩個參數(shù),第一個是初始值,就是開始計算前就已經(jīng)有一個數(shù)值了。第二個參數(shù)是一個Lambda表達式,用來對各個元素做計算。

List list = Arrays.asList(1,2,3,4,5);
int sum = list.stream().reduce(0,(a,b) -> a - b);
System.out.println(sum);

在Java 8中Integer中新增了一個sum方法,它的作用和上面的Lambda表達效果一樣,所以我們可以使用這個方法的方法引用來簡化代碼。

List list = Arrays.asList(1,2,3,4,5);
int sum = list.stream().reduce(0,Integer::sum);
System.out.println(sum);

我們還可以用這個方法來求最大值和最小值,在Integer中還新增了minmax方法,等同于(x, y) -> x < y ? x : y、(x, y) -> x > y ? x : y,這樣我們就可以求出流中的最大值和最小值了。

Optional min = numbers.stream().reduce(Integer::min);
Optional min = numbers.stream().reduce(Integer::max);

以上就是stream的篩選、查找、匹配和歸約操作中比較常用的方法了,下面還會介紹分組、分區(qū)等功能。

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://m.hztianpu.com/yun/76554.html

相關(guān)文章

  • Java 8stream實際應(yīng)用

    摘要:前言在前面的之介紹和使用和之進階中講了的使用方式和一些常用的方法,這篇文章就來演示一下的實際應(yīng)用。實際應(yīng)用先創(chuàng)建一個訂單類和商品類,每個訂單都有年份商品數(shù)量和商品對象屬性,而商品類里面則包含了名字和價格屬性。 前言: 在前面的 Java 8之stream介紹和使用 和 Java 8之stream進階 中講了stream的使用方式和一些常用的方法,這篇文章就來演示一下stream的實際應(yīng)...

    jonh_felix 評論0 收藏0
  • Java8的CompletableFuture進階

    摘要:方法接收的是的實例,但是它沒有返回值方法是函數(shù)式接口,無參數(shù),會返回一個結(jié)果這兩個方法是的升級,表示讓任務(wù)在指定的線程池中執(zhí)行,不指定的話,通常任務(wù)是在線程池中執(zhí)行的。該的接口是在線程使用舊的接口,它不允許返回值。 簡介 作為Java 8 Concurrency API改進而引入,本文是CompletableFuture類的功能和用例的介紹。同時在Java 9 也有對Completab...

    SunZhaopeng 評論0 收藏0
  • Java核心技術(shù)教程整理,長期更新

    以下是Java技術(shù)棧微信公眾號發(fā)布的關(guān)于 Java 的技術(shù)干貨,從以下幾個方面匯總。 Java 基礎(chǔ)篇 Java 集合篇 Java 多線程篇 Java JVM篇 Java 進階篇 Java 新特性篇 Java 工具篇 Java 書籍篇 Java基礎(chǔ)篇 8張圖帶你輕松溫習(xí) Java 知識 Java父類強制轉(zhuǎn)換子類原則 一張圖搞清楚 Java 異常機制 通用唯一標(biāo)識碼UUID的介紹及使用 字符串...

    Anchorer 評論0 收藏0
  • Java 總結(jié)

    摘要:中的詳解必修個多線程問題總結(jié)個多線程問題總結(jié)有哪些源代碼看了后讓你收獲很多,代碼思維和能力有較大的提升有哪些源代碼看了后讓你收獲很多,代碼思維和能力有較大的提升開源的運行原理從虛擬機工作流程看運行原理。 自己實現(xiàn)集合框架 (三): 單鏈表的實現(xiàn) 自己實現(xiàn)集合框架 (三): 單鏈表的實現(xiàn) 基于 POI 封裝 ExcelUtil 精簡的 Excel 導(dǎo)入導(dǎo)出 由于 poi 本身只是針對于 ...

    caspar 評論0 收藏0
  • 你和阿里資深架構(gòu)師間,差的不僅僅是年齡(進階必看)

    摘要:導(dǎo)讀閱讀本文需要有足夠的時間,筆者會由淺到深帶你一步一步了解一個資深架構(gòu)師所要掌握的各類知識點,你也可以按照文章中所列的知識體系對比自身,對自己進行查漏補缺,覺得本文對你有幫助的話,可以點贊關(guān)注一下。目錄一基礎(chǔ)篇二進階篇三高級篇四架構(gòu)篇五擴 導(dǎo)讀:閱讀本文需要有足夠的時間,筆者會由淺到深帶你一步一步了解一個資深架構(gòu)師所要掌握的各類知識點,你也可以按照文章中所列的知識體系對比自身,對自己...

    huaixiaoz 評論0 收藏0

發(fā)表評論

0條評論

閱讀需要支付1元查看
<