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

一文帶你掌握Java8強大的StreamAPI

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

Stream 概述

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

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

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

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

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

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

Stream 操作的三個步驟:
①Stream 實例化(創(chuàng)建):一個數據源(如:集合、數組),獲取一個流。
②中間操作:一個中間操作鏈,對數據源的數據進行處理。
③終止操作(終端操作):一旦執(zhí)行終止操作,就執(zhí)行中間操作鏈,并產生結果。之后,不能再被使用(需要的話需要另一個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、方式二:通過數組

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

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()

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

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 用它來進行網絡搜索而出名。

在這里插入圖片描述

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 接口中方法的實現決定了如何對流執(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內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

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

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

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

    SWT(JFace) FTP客戶端實現

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

    Java實現HTTP請求的4種方式總結

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

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

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

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

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

    Java?離線中文語音文字識別功能的實現代碼

    這篇文章主要介紹了Java?離線中文語音文字識別,本次使用springboot?+maven實現,官方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è)調度框架,為在Java應用程序中進行作業(yè)調度提供了簡單卻強大的機制
    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解讀,??多線程訪問同一個共享變量的時候容易出現并發(fā)問題,因此為了保證線程安全性,我們都會采用加鎖的方式,而ThreadLocal是除加鎖方式之外的另一種保證線程安全性的方法,需要的朋友可以參考下
    2023-09-09

最新評論

姜堰市| 延边| 体育| 涿鹿县| 贡山| 临夏县| 惠东县| 西畴县| 泸溪县| 南郑县| 民权县| 务川| 抚顺县| 桐城市| 尚志市| 界首市| 瑞金市| 德安县| 吉林省| 高雄县| 锡林郭勒盟| 屯昌县| 龙里县| 南雄市| 临猗县| 麟游县| 察隅县| 额敏县| 呼图壁县| 获嘉县| 绵竹市| 原阳县| 包头市| 安阳市| 思南县| 故城县| 娄底市| 东乌| 东明县| 砀山县| 章丘市|