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

一文帶你掌握Java8強大的StreamAPI

 更新時間:2021年10月08日 10:29:42   作者:葉綠體不忘呼吸  
Java8API添加了一個新的抽象稱為流Stream,可以讓你以一種聲明的方式處理數(shù)據(jù)。Stream 使用一種類似用SQL 語句從數(shù)據(jù)庫查詢數(shù)據(jù)的直觀方式來提供一種對 Java 集合運算和表達的高階抽象。Stream API可以極大提高Java程序員的生產(chǎn)力,讓程序員寫出高效率、干凈、簡潔的代碼

Stream 概述

Stream API ( java.util.stream) 把真正的函數(shù)式編程風格引入到Java中。這是目前為止對Java類庫最好的補充,因為Stream API可以極大提供Java程序員的生產(chǎn)力,讓程序員寫出高效率、干凈、簡潔的代碼。

Stream 是 Java8 中處理集合的關鍵抽象概念,它可以指定你希望對集合進行的操作,可以執(zhí)行非常復雜的查找、過濾和映射數(shù)據(jù)等操作。 使用Stream API 對集合數(shù)據(jù)進行操作,就類似于使用 SQL 執(zhí)行的數(shù)據(jù)庫查詢。也可以使用 Stream API 來并行執(zhí)行操作。簡言之,Stream API提供了一種高效且易于使用的處理數(shù)據(jù)的方式。

實際開發(fā)中,項目中多數(shù)數(shù)據(jù)源都來自于Mysql,Oracle等。但隨著數(shù)據(jù)源豐富,有MongDB,Radis等,這些NoSQL的數(shù)據(jù)就需要Java層面去處理。

Stream 和 Collection 集合的區(qū)別:Collection 是一種靜態(tài)的內(nèi)存數(shù)據(jù)結構,而Stream 是有關計算的。前者是主要面向內(nèi)存,存儲在內(nèi)存中,后者主要是面向 CPU,通過 CPU 實現(xiàn)計算。

Stream 是數(shù)據(jù)渠道,用于操作數(shù)據(jù)源(集合、數(shù)組等)所生成的元素序列。
“集合講的是數(shù)據(jù),Stream講的是計算?!?/p>

注意:
①Stream 不會存儲元素。
②Stream 不會改變源對象。其會返回一個持有結果的新Stream。
③Stream 操作是延遲執(zhí)行的。其會等到需要結果的時候才執(zhí)行。

Stream 操作的三個步驟:
①Stream 實例化(創(chuàng)建):一個數(shù)據(jù)源(如:集合、數(shù)組),獲取一個流。
②中間操作:一個中間操作鏈,對數(shù)據(jù)源的數(shù)據(jù)進行處理。
③終止操作(終端操作):一旦執(zhí)行終止操作,就執(zhí)行中間操作鏈,并產(chǎn)生結果。之后,不能再被使用(需要的話需要另一個Stream)。

在這里插入圖片描述

Stream 實例化

1、方式一:通過集合

Java8 中的 Collection 接口被擴展,提供了兩個獲取流的方法:

import java.util.ArrayList;
import java.util.stream.Stream;

public class StreamAPITest {
    public static void main(String[] args) {
        List<String> arrayList = new ArrayList<>();
        arrayList.add("aa");
        arrayList.add("哈哈");
        arrayList.add("99");
        //返回一個順序流,即"aa"->"哈哈"->"99"
        Stream<String> stream1 = arrayList.stream();
        //返回一個并行流
        Stream<String> stream2 = arrayList.parallelStream();
    }
}

2、方式二:通過數(shù)組

Java8 中的 Arrays 的靜態(tài)方法 stream() 可以獲取數(shù)組流:

import java.util.Arrays;
import java.util.stream.Stream;

public class StreamAPITest {
    public static void main(String[] args) {
        Double[] doubles = {1.1, 2.0, 4.3, 9.9};
        Stream<Double> stream = Arrays.stream(doubles);
    }
}

在這里插入圖片描述

3、方式三:通過Stream的of()

調(diào)用Stream類靜態(tài)方法 of(),通過顯示值創(chuàng)建一個流,其可接收任意數(shù)量的參數(shù):

import java.util.stream.Stream;

public class StreamAPITest {
    public static void main(String[] args) {
        Double[] doubles = {1.1, 2.0, 4.3, 9.9};
        Stream<Double> doubles1 = Stream.of(doubles);
        Stream<? extends Number> stream = Stream.of(1, 2, 3, 9.9);
    }
}

4、方式四:創(chuàng)建無限流

可以使用靜態(tài)方法 Stream.iterate() 和 Stream.generate() 創(chuàng)建無限流:

import java.util.stream.Stream;

public class StreamAPITest {
    public static void main(String[] args) {
        // 迭代
        // public static<T> Stream<T> iterate(final T seed, final UnaryOperator<T> f)
        Stream<Integer> stream = Stream.iterate(0, x -> x + 2);
        stream.limit(10).forEach(System.out::println);
        // 生成
        // public static<T> Stream<T> generate(Supplier<T> s)
        Stream<Double> stream1 = Stream.generate(Math::random);
        stream1.limit(10).forEach(System.out::println);
    }
}

Stream 中間操作

多個中間操作可以連接起來形成一個流水線,除非流水線上觸發(fā)終止操作,否則中間操作不會執(zhí)行任何的處理。而在終止操作時一次性全部處理,稱為“惰性求值”。

1、篩選與切片

在這里插入圖片描述

import java.util.Arrays;
import java.util.List;
import java.util.stream.Stream;

/**
 * @Author: Yeman
 * @Date: 2021-10-05-17:25
 * @Description:
 */
public class StreamAPITest {
    public static void main(String[] args) {
        List<String> arrayList = Arrays.asList("aa","bb","cc","aa");
        Stream<String> stream = arrayList.stream();
        stream.filter(e -> !e.equals("aa")).forEach(System.out :: println); //bb cc
        System.out.println("==========");
        arrayList.stream().limit(2).forEach(System.out :: println); //aa bb
        System.out.println("==========");
        arrayList.stream().skip(2).forEach(System.out :: println); //cc aa
        System.out.println("==========");
        arrayList.stream().distinct().forEach(System.out :: println); //aa bb cc
    }
}

2、映射

在這里插入圖片描述

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Stream;

/**
 * @Author: Yeman
 * @Date: 2021-10-05-17:25
 * @Description:
 */
public class StreamAPITest {
    public static void main(String[] args) {
        List<String> arrayList = Arrays.asList("aa","bb","cc","aa");
        Stream<String> stream = arrayList.stream();
        stream.map(x -> x.toUpperCase()).forEach(System.out :: println); //AA BB CC AA
        System.out.println("====================");
        arrayList.stream().map(StreamAPITest::fromStringToStream).forEach(System.out :: println); //類似于add()
        arrayList.stream().flatMap(StreamAPITest::fromStringToStream).forEach(System.out :: println); //類似于addAll()
    }

    public static Stream<Character> fromStringToStream(String str){
        ArrayList<Character> arrayList = new ArrayList<>();
        for (Character c : str.toCharArray()){
            arrayList.add(c);
        }
        return arrayList.stream();
    }
}

3、排序

在這里插入圖片描述

import java.util.Arrays;
import java.util.List;

/**
 * @Author: Yeman
 * @Date: 2021-10-05-17:25
 * @Description:
 */
public class StreamAPITest {
    public static void main(String[] args) {
        List<Integer> list = Arrays.asList(2, -9, 0, 22, 6, -1);
        list.stream().sorted().forEach(System.out::println);
        System.out.println("===============");
        list.stream().sorted((e1,e2) -> -Integer.compare(e1,e2)).forEach(System.out :: println);
    }
}

Stream 終止操作

終端操作會從流的流水線生成結果。其結果可以是任何不是流的值,例如:List、Integer,甚至是 void 。流進行了終止操作后,不能再次使用。

1、匹配與查找

在這里插入圖片描述

在這里插入圖片描述

import java.util.Arrays;
import java.util.List;
import java.util.Optional;

/**
 * @Author: Yeman
 * @Date: 2021-10-05-17:25
 * @Description:
 */
public class StreamAPITest {
    public static void main(String[] args) {
        List<Integer> list = Arrays.asList(2, -9, 0, 22, 6, -1);

        boolean allMatch = list.stream().allMatch(e -> e > 0);
        System.out.println(allMatch);
        boolean anyMatch = list.stream().anyMatch(e -> e > 0);
        System.out.println(anyMatch);
        boolean noneMatch = list.stream().noneMatch(e -> e > 100);
        System.out.println(noneMatch);

        System.out.println("==========================");

        Optional<Integer> first = list.stream().sorted().findFirst();
        System.out.println(first);
        Optional<Integer> any = list.parallelStream().findAny();
        System.out.println(any);

        System.out.println("==========================");

        long count = list.stream().filter(e -> e > 0).count();
        System.out.println(count);

        System.out.println("==========================");

        Optional<Integer> max = list.stream().max(Integer :: compare);
        System.out.println(max);
        Optional<Integer> min = list.stream().min((e1, e2) -> Integer.compare(e1, e2));
        System.out.println(min);

        System.out.println("==========================");
        list.stream().forEach(System.out :: println);
    }
}

2、歸約

map 和 reduce 的連接通常稱為 map-reduce 模式,因 Google 用它來進行網(wǎng)絡搜索而出名。

在這里插入圖片描述

import java.util.Arrays;
import java.util.List;
import java.util.Optional;

/**
 * @Author: Yeman
 * @Date: 2021-10-05-17:25
 * @Description:
 */
public class StreamAPITest {
    public static void main(String[] args) {
        List<Integer> list = Arrays.asList(2, -9, 0, 22, 6, -1);
        Integer reduce1 = list.stream().reduce(0, Integer::sum);
        Integer reduce11 = list.stream().reduce(0, (e1,e2) -> e1 + e2);
        System.out.println(reduce1);
        System.out.println(reduce11);
        Optional<Integer> reduce2 = list.stream().reduce(Integer::sum);
        System.out.println(reduce2);
    }
}

3、收集

在這里插入圖片描述


Collector 接口中方法的實現(xiàn)決定了如何對流執(zhí)行收集的操作(如收集到 List、Set、
Map)。另外, Collectors 實用類提供了很多靜態(tài)方法,可以方便地創(chuàng)建常見收集器實例,具體方法與實例如下表:

在這里插入圖片描述

在這里插入圖片描述

import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

/**
 * @Author: Yeman
 * @Date: 2021-10-05-17:25
 * @Description:
 */
public class StreamAPITest {
    public static void main(String[] args) {
        List<Integer> list = Arrays.asList(2, -9, 0, 22, 6, -1);
        List<Integer> collect = list.stream().filter(e -> e > 0).collect(Collectors.toList());
        collect.forEach(System.out :: println); //2 22 6
    }
}

到此這篇關于一文帶你掌握Java8強大的StreamAPI 的文章就介紹到這了,更多相關Java Stream內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Springboot項目優(yōu)雅地處理日志的方法詳解

    Springboot項目優(yōu)雅地處理日志的方法詳解

    這篇文章主要介紹了Springboot項目---優(yōu)雅地處理日志,本文通過實例圖文相結合給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-07-07
  • SWT(JFace) FTP客戶端實現(xiàn)

    SWT(JFace) FTP客戶端實現(xiàn)

    SWT(JFace)小制作:FTP客戶端實現(xiàn)
    2009-06-06
  • Java實現(xiàn)HTTP請求的4種方式總結

    Java實現(xiàn)HTTP請求的4種方式總結

    這篇文章主要給大家介紹了關于Java實現(xiàn)HTTP請求的4種方式,在java開發(fā)中,經(jīng)常遇到需要調(diào)用第三方提供的接口服務的需求,文中給出了詳細的代碼示例,需要的朋友可以參考下
    2023-08-08
  • struts2配置靜態(tài)資源代碼詳解

    struts2配置靜態(tài)資源代碼詳解

    這篇文章主要介紹了struts2配置靜態(tài)資源的相關內(nèi)容,文中涉及了具體代碼介紹,需要的朋友可以參考下。
    2017-09-09
  • 教你怎么在IDEA中創(chuàng)建java多模塊項目

    教你怎么在IDEA中創(chuàng)建java多模塊項目

    這篇文章主要介紹了教你怎么在IDEA中創(chuàng)建java多模塊項目,文中有非常詳細的代碼示例,對正在學習java的小伙伴們有非常好的幫助,需要的朋友可以參考下
    2021-04-04
  • Java?離線中文語音文字識別功能的實現(xiàn)代碼

    Java?離線中文語音文字識別功能的實現(xiàn)代碼

    這篇文章主要介紹了Java?離線中文語音文字識別,本次使用springboot?+maven實現(xiàn),官方demo為springboot+gradle,結合實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-07-07
  • java 使用foreach遍歷集合元素的實例

    java 使用foreach遍歷集合元素的實例

    這篇文章主要介紹了java 使用foreach遍歷集合元素的實例的相關資料,這里提供實例幫助大家理解如何使用foreach 進行遍歷,希望能幫助到大家,
    2017-08-08
  • SpringBoot?整合?Quartz?定時任務框架詳解

    SpringBoot?整合?Quartz?定時任務框架詳解

    這篇文章主要介紹了SpringBoot整合Quartz定時任務框架詳解,Quartz是一個完全由Java編寫的開源作業(yè)調(diào)度框架,為在Java應用程序中進行作業(yè)調(diào)度提供了簡單卻強大的機制
    2022-08-08
  • 一文帶你認識java中的String類

    一文帶你認識java中的String類

    在Java語言中,所有類似“ABC”的字面值,都是String類的實例,String類位于java.lang包下,是Java語言的核心類,提供了字符串的比較、查找、截取、大小寫轉換等操作,這篇文章主要給大家介紹了關于java中String類的相關資料,需要的朋友可以參考下
    2021-10-10
  • Java多線程中ThreadLocal解讀

    Java多線程中ThreadLocal解讀

    這篇文章主要介紹了Java多線程中ThreadLocal解讀,??多線程訪問同一個共享變量的時候容易出現(xiàn)并發(fā)問題,因此為了保證線程安全性,我們都會采用加鎖的方式,而ThreadLocal是除加鎖方式之外的另一種保證線程安全性的方法,需要的朋友可以參考下
    2023-09-09

最新評論

沙湾县| 香港| 滕州市| 金湖县| 双柏县| 黎城县| 武清区| 太白县| 西青区| 丁青县| 安仁县| 伊春市| 绩溪县| 鄂伦春自治旗| 公主岭市| 开封市| 淮北市| 姜堰市| 图们市| 裕民县| 诸城市| 威宁| 桓仁| 民和| 汉沽区| 神农架林区| 张家港市| 会宁县| 合江县| 霍邱县| 五台县| 万宁市| 呼图壁县| 宁都县| 贡嘎县| 顺义区| 洞口县| 休宁县| 阳谷县| 凤冈县| 罗甸县|