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

Java8 Stream中間操作實(shí)例解析

 更新時(shí)間:2019年12月11日 09:15:32   作者:碼之初  
這篇文章主要介紹了Java8 Stream中間操作實(shí)例解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下

這篇文章主要介紹了Java8 Stream中間操作實(shí)例解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下

介紹Stream

Stream 使用一種類(lèi)似用于SQL 語(yǔ)句從數(shù)據(jù)庫(kù)查詢數(shù)據(jù)的直觀方式來(lái)提供一種對(duì) Java 集合運(yùn)算和表達(dá)的高階抽象。 Stream API可以極大提高Java程序員的生產(chǎn)力,讓程序員寫(xiě)出高效率、干凈、簡(jiǎn)潔的代碼。 這種風(fēng)格將要處理的元素集合看作一種流,流在管道中傳輸,并且可以在管道的節(jié)點(diǎn)上進(jìn)行處理,比如篩選,排序,聚合等。

Stream兩種操作

中間操作(Intermediate Operations):中間操作會(huì)返回一個(gè)新的流,一個(gè)流可以后面跟隨零個(gè)或多個(gè)intermediate操作。其目的主要是打開(kāi)流,做出某種程度的數(shù)據(jù)映射/過(guò)濾,然后會(huì)返回一個(gè)新的流,交給下一個(gè)操作使用。這類(lèi)操作都是惰性化的(lazy),就是說(shuō),僅僅調(diào)用到這類(lèi)方法,并沒(méi)有真正開(kāi)始流的遍歷。而是在終端操作開(kāi)始的時(shí)候才真正開(kāi)始執(zhí)行。

終端操作(Terminal Operations):是指返回最終的結(jié)果。一個(gè)流只能有一個(gè)terminal操作,當(dāng)這個(gè)操作執(zhí)行后,流就被使用“光”了,無(wú)法再被操作。所以這必定是流的最后一個(gè)操作。Terminal操作的執(zhí)行,才會(huì)真正開(kāi)始流的遍歷,并且會(huì)生成一個(gè)結(jié)果,或者一個(gè) side effect。

中間操作方法分類(lèi):

  • filter()
  • map()
  • flatMap()
  • distinct()
  • sorted()
  • peek()
  • limit()
  • skip()

終端操作方法分類(lèi):

  • forEach()
  • forEachOrdered()
  • toArray()
  • reduce()
  • collect()
  • min()
  • max()
  • count()
  • anyMatch()
  • allMatch()
  • noneMatch()
  • findFirst()
  • findAny()

中間操作代碼實(shí)例詳解

1、filter(): 返回結(jié)果生成新的流中只包含滿足篩選條件的數(shù)據(jù)。

// 1、filter,返回大于2的元素集合
    List<Integer> nums = Arrays.asList(1, 2, 3, 4, 5);
    List<Integer> result = nums.stream().filter(n -> n > 2).collect(Collectors.toList());
    System.out.println(result);

運(yùn)行結(jié)果:[3, 4, 5]

2、map():將流中的元素進(jìn)行再次加工形成一個(gè)新流,流中的每一個(gè)元素映射為另外的元素。

// 2、map:返回元素的大寫(xiě)類(lèi)型和哈希值
    List<String> mzc = Arrays.asList("ma", "zhi", "chu");
    List<String> mzcUpperCase = mzc.stream().
        map(n -> n.toUpperCase()).
        collect(Collectors.toList());
    List<Integer> mzcHashCode = mzc.stream().map(n -> n.hashCode()).collect(Collectors.toList());
    System.out.println("mzcUpperCase:"+mzcUpperCase+" ----- mzcHashCode:"+mzcHashCode);

運(yùn)行結(jié)果:

mzcUpperCase:[MA, ZHI, CHU] ----- mzcHashCode:[3476, 120571, 98480]

示例場(chǎng)景:取出商品的所有id,就可以這樣寫(xiě)(偽代碼):

List<Product> productList = productService.selectAll();

List<Integer> pIds = productList.stream().map(p->p.getId).collect(Collectors.toList());

這樣就可以拿到所有商品id的集合。

3、flatMap():扁平化映射,它具體的操作是將多個(gè)stream連接成一個(gè)stream,這個(gè)操作是針對(duì)類(lèi)似多維數(shù)組的,比如集合里面包含集合,相當(dāng)于降維作用。

flatMap是將流中的每個(gè)元素都放到一個(gè)流中,最后將所有的流合并成一個(gè)新流,所有流對(duì)象中的元素都合并到這個(gè)新生成的流中返回。

// flatMap:將多層集合中的元素取出來(lái),放到一個(gè)新的集合中去
    List<Integer> num1 = Arrays.asList(1, 2, 3);
    List<Integer> num2 = Arrays.asList(4, 5, 6);
    List<Integer> num3 = Arrays.asList(7, 8, 9);
    List<List<Integer>> lists = Arrays.asList(num1, num2, num3);
    Stream<Integer> outputStream = lists.stream().flatMap(l -> l.stream());
    List<Integer> flatMapResult = outputStream.sorted().collect(Collectors.toList());
    System.out.println(flatMapResult);

運(yùn)行結(jié)果:[1, 2, 3, 4, 5, 6, 7, 8, 9]

示例場(chǎng)景:取出所有部門(mén)人員的姓名,就可以這樣寫(xiě)(偽代碼):

// 1、取出所有部門(mén)

List<Department> departments = ...;

// 2、這個(gè)時(shí)候可以利用flatMap先將所有部門(mén)的所有人員匯聚起來(lái)

List<Person> persons = departments.stream.flatMap(d->d.getPersonList()).collect(Collectors.toList());

// 3、再利用map()方法取出

4、distinct():顧名思義,將流中的元素去重之后輸出。

List<String> mzc = Stream.of("ma","zhi","chu","zhi","shuo","ma")
    .distinct()
    .collect(Collectors.toList());
System.out.println(mzc);

運(yùn)行結(jié)果:[ma, zhi, chu, shuo]

5、sorted():這個(gè)很簡(jiǎn)單了,顧名思義,將流中的元素按照自然排序方式進(jìn)行排序。

// sorted:自然順序排序
    List<Integer> nums = Arrays.asList(1, 3, 5, 6, 8, 2);
    List<Integer> sortedNum = nums.stream().sorted().collect(Collectors.toList());
    System.out.println(sortedNum);
 
    // sorted:降序排序
    List<Integer> sortedNum2 = nums.stream().sorted(Comparator.reverseOrder()).collect(Collectors.toList());
    System.out.println(sortedNum2);
 
    // sorted:使用Comparator
    List<Integer> sortedNums3 = nums.stream().sorted(Comparator.comparing(n -> n)).collect(Collectors.toList());
    System.out.println(sortedNums3);
 
    // 不用stream直接順序排序
    nums.sort(Comparator.comparing(Integer::intValue));
    System.out.println(nums);
 
    //不用stream直接降序排序
    nums.sort(Comparator.comparing(Integer::intValue).reversed());
    System.out.println(nums);

運(yùn)行結(jié)果:

[1, 2, 3, 5, 6, 8]

[8, 6, 5, 3, 2, 1]

[1, 2, 3, 5, 6, 8]

[1, 2, 3, 5, 6, 8]

[8, 6, 5, 3, 2, 1]

6、peek():對(duì)流中每個(gè)元素執(zhí)行操作,并返回一個(gè)新的流,返回的流還是包含原來(lái)流中的元素。

// peek():
    String[] arr = new String[]{"a","b","c","d"};
    Arrays.stream(arr)
        .peek(System.out::println) //a,b,c,d
        .count();
 
    // peek()+filter()
    Stream.of("ma", "zhi", "chu")
        .filter(e -> e.length() > 2)
        .peek(e -> System.out.println(e))
        .collect(Collectors.toList());

運(yùn)行結(jié)果:

a

b

c

d

zhi

chu

7、limit():顧名思義,返回指定數(shù)量的元素的流。返回的是Stream里前面的n個(gè)元素。

// limit():取出100中的前十個(gè)
    List<Integer> limitNum = IntStream.range(1,100).limit(10)
        .boxed()
        .collect(Collectors.toList());
    System.out.println(limitNum);
 
    // limit():取出前4個(gè)單詞
    List<String> words = Arrays.asList("ma", "zhi", "chu", "wait", "you", "follow");
    List<String> limitWord = words.stream().limit(4).collect(Collectors.toList());
    System.out.println(limitWord);

運(yùn)行結(jié)果:

[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

[ma, zhi, chu, wait]

8、skip():和limit()相反,將前幾個(gè)元素跳過(guò)(取出)再返回一個(gè)流,如果流中的元素小于或者等于n,就會(huì)返回一個(gè)空的流。

// skip():跳過(guò)前面三個(gè)單詞再返回
  List<String> words = Arrays.asList("ma", "zhi", "chu", "wait", "you", "follow");
  List<String> skipWord = words.stream().limit(4).collect(Collectors.toList());
  System.out.println(skipWord);
 
  // skip():跳過(guò)全部單詞再返回
  List<String> emptyWord = words.stream().skip(6).collect(Collectors.toList());
  System.out.println(emptyWord);
 
  // skip():跳過(guò)超過(guò)單詞長(zhǎng)度的數(shù)目再返回
  List<String> emptyWord2 = words.stream().skip(10).collect(Collectors.toList());
  System.out.println(emptyWord);

運(yùn)行結(jié)果:

[91, 92, 93, 94, 95, 96, 97, 98, 99]

[ma, zhi, chu, wait]

[]

[]

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • java之swing表格實(shí)現(xiàn)方法

    java之swing表格實(shí)現(xiàn)方法

    這篇文章主要介紹了java之swing表格實(shí)現(xiàn)方法,以實(shí)例形式分析了swing構(gòu)建表格的方法,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-09-09
  • 淺談JDK8中的Duration Period和ChronoUnit

    淺談JDK8中的Duration Period和ChronoUnit

    在JDK8中,引入了三個(gè)非常有用的時(shí)間相關(guān)的API:Duration,Period和ChronoUnit。他們都是用來(lái)對(duì)時(shí)間進(jìn)行統(tǒng)計(jì)的,本文將會(huì)詳細(xì)講解一下這三個(gè)API的使用
    2021-06-06
  • 構(gòu)建springboot自動(dòng)生成mapper文件和dao接口項(xiàng)目的步驟和配置方法

    構(gòu)建springboot自動(dòng)生成mapper文件和dao接口項(xiàng)目的步驟和配置方法

    這篇文章主要介紹了構(gòu)建springboot自動(dòng)生成mapper文件和dao接口項(xiàng)目的步驟和配置方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-05-05
  • 淺析spring定時(shí)器的使用

    淺析spring定時(shí)器的使用

    這篇文章主要介紹了淺析spring定時(shí)器的使用,幫助大家更好的理解和學(xué)習(xí)spring框架,感興趣的朋友可以了解下
    2020-10-10
  • 深入解析Java反射之基礎(chǔ)篇

    深入解析Java反射之基礎(chǔ)篇

    JAVA反射機(jī)制是在運(yùn)行狀態(tài)中,對(duì)于任意一個(gè)類(lèi),都能夠知道這個(gè)類(lèi)的所有屬性和方法,這篇文章主要給大家介紹了關(guān)于Java反射之基礎(chǔ)篇的相關(guān)資料,需要的朋友可以參考下
    2021-11-11
  • 使用Jersey構(gòu)建圖片服務(wù)器過(guò)程解析

    使用Jersey構(gòu)建圖片服務(wù)器過(guò)程解析

    這篇文章主要介紹了使用Jersey構(gòu)建圖片服務(wù)器過(guò)程解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-10-10
  • 詳解Java中native方法的使用

    詳解Java中native方法的使用

    native是與C++聯(lián)合開(kāi)發(fā)的時(shí)候用的!使用native關(guān)鍵字說(shuō)明這個(gè)方法是原生函數(shù),也就是這個(gè)方法是用C/C++語(yǔ)言實(shí)現(xiàn)的,并且被編譯成了DLL,由java去調(diào)用。本文給大家介紹java 中native方法使用,感興趣的朋友一起看看吧
    2020-09-09
  • Java Base64算法實(shí)際應(yīng)用之郵件發(fā)送實(shí)例分析

    Java Base64算法實(shí)際應(yīng)用之郵件發(fā)送實(shí)例分析

    這篇文章主要介紹了Java Base64算法實(shí)際應(yīng)用之郵件發(fā)送,結(jié)合實(shí)例形式分析了java字符編碼與郵件發(fā)送相關(guān)操作技巧,需要的朋友可以參考下
    2019-09-09
  • java synchronized用法詳解

    java synchronized用法詳解

    本篇文章主要介紹了java synchronized用法詳解,synchronized是Java中的關(guān)鍵字,是一種同步鎖。有興趣的同學(xué)可以了解一下。
    2016-11-11
  • 詳解Java中l(wèi)og4j.properties配置與加載應(yīng)用

    詳解Java中l(wèi)og4j.properties配置與加載應(yīng)用

    這篇文章主要介紹了 log4j.properties配置與加載應(yīng)用的相關(guān)資料,需要的朋友可以參考下
    2018-02-02

最新評(píng)論

安福县| 博野县| 林芝县| 济南市| 丰都县| 六枝特区| 塔城市| 内丘县| 清苑县| 任丘市| 门源| 彭阳县| 贡嘎县| 山丹县| 大同市| 循化| 错那县| 巴青县| 天柱县| 额敏县| 芒康县| 铜陵市| 额尔古纳市| 邵阳市| 黑山县| 盐源县| 漯河市| 衡水市| 佛山市| 二连浩特市| 富蕴县| 昌邑市| 和硕县| 安远县| 六枝特区| 灵川县| 宁夏| 海淀区| 台前县| 横山县| 西乌珠穆沁旗|