欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

聊一聊Java中的Steam流

 更新時間:2023年07月10日 10:42:34   作者:京東云開發(fā)者  
當(dāng)我們需要處理的數(shù)據(jù)量很大的時候,為了提高性能,就需要使用到并行處理,這樣的處理方式是很復(fù)雜的,流可以幫助開發(fā)者節(jié)約寶貴的時間,讓以上的事情變得輕松,本文就和大家聊一聊Java中的Steam流,感興趣的同學(xué)跟著小編一起來看看吧

1 引言

在我們的日常編程任務(wù)中,對于集合的制造和處理是必不可少的。當(dāng)我們需要對于集合進(jìn)行分組或查找的操作時,需要用迭代器對于集合進(jìn)行操作,而當(dāng)我們需要處理的數(shù)據(jù)量很大的時候,為了提高性能,就需要使用到并行處理,這樣的處理方式是很復(fù)雜的。流可以幫助開發(fā)者節(jié)約寶貴的時間,讓以上的事情變得輕松。

2 流簡介

流到底是什么呢?簡要的定義為“從支持?jǐn)?shù)據(jù)處理操作的源生成的元素序列”,接下來對于這個定義進(jìn)行簡要分析。

2.1 支持?jǐn)?shù)據(jù)處理操作

流的數(shù)據(jù)處理操作和數(shù)據(jù)庫的可以聲明式的指定分組或查找等功能支持類似,和函數(shù)式編程的思想一致,如filter、map、reduce、find、match、sort等操作,這些流操作可以串行執(zhí)行,也可以并行執(zhí)行。

2.2 源

流會使用一個提供數(shù)據(jù)的源,可以通過三種方式來創(chuàng)建對象流,一種是由集合對象創(chuàng)建流:

List<Integer> list = Arrays.asList(111,222,333);
Stream<Integer> stream = list.stream();

一種是由數(shù)組創(chuàng)建流:

IntStream stream = Arrays.stream(new int(){111,222,333});

一種是由靜態(tài)方法Stream.of()創(chuàng)建流,底層還是Arrays.stream():

Stream<Integer> stream = Stream.of(111, 222, 333);

Stream stream = Stream.of(111, 222, 333);

從有序集合生成流時會保留原有的順序。由列表生成的流,其元素順序與列表一致。
還有兩種特殊的流:

  • 空流:Stream.empty()
  • 無限流:Stream.genarate()

2.3 元素序列

流也可以和集合一樣訪問包含特定的元素類型的一組有序值,但是它們的主要目的不一樣,集合的主要目的是在于存儲和訪問元素,流的主要目的在于表達(dá)計算。

3 流的思想

流式思想和生產(chǎn)中的流水線具有異曲同工之妙,很多流模型都會返回一個流,這些模型都只負(fù)責(zé)它所需要做的事情,并不需要格外的內(nèi)存空間來存儲處理的結(jié)果。這些流模型可以被鏈接起來形成一個大的流水線,我們在這個過程中不關(guān)注中間步驟的數(shù)據(jù)被如何處理,只需要使用整個流水線處理后的結(jié)果。接下來的代碼可以體現(xiàn)這種思想,代碼中以商品為例,我們要篩選出商品中體積大于200的前兩個商品的名字。

首先是商品類的定義:

public class Goods {
    private final String Name;
    private final Integer Volume;
    public Goods(String name, Integer volume) {
        Name = name;
        Volume = volume;
    }
    public String getName() {
        return Name;
    }
    public Integer getVolume() {
        return Volume;
    }
}

接下來是商品集合的定義:

List<Goods> goods = Arrays.asList(new Goods("土豆",10),
new Goods("冰箱",900),new Goods("辦公椅",300));

接下來獲取我們想要的結(jié)果:

List<String> twofoods = goods.stream()//獲取流
    .filter(goods1 -> goods1.getVolume()>200)//篩選商品體積大于200的
    .map(Goods::getName)//獲取商品名稱
    .limit(2)//篩選頭兩個商品
    .collect(Collectors.toList());//將結(jié)果保存在list中

這樣看來,通過流來處理我們的特定需求,是不是比使用集合的迭代要方便很多呢?

4 流處理的特性

  • 不存儲數(shù)據(jù)
  • 不會改變數(shù)據(jù)源
  • 只可被使用一次

這里我們使用一個測試類StreamCharacteristic來驗(yàn)證流處理的以上特性:

import org.springframework.util.Assert;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;
public class StreamCharacteristic {
    public void test1(){
        List<Integer> list = Arrays.asList(1,2,2,5,6,9);
        list.stream().distinct();
        System.out.println(list.size());
    }
    public void test2(){
        List<String> list = Arrays.asList("wms", "KA", "5.0");
        Stream<String> stream = list.stream();
        stream.forEach(System.out::println);
        stream.forEach(System.out::println);
    }
}

test1()中的結(jié)果為6,盡管我們對于list對象所生成的Stream流做了去重操作distinct(),但是不影響數(shù)據(jù)源list。

test2()中調(diào)用了兩次 stream.forEach方法來打印每一個單詞,第二次調(diào)用時,拋出了一個“java.lang.IllegalStateException”異常:“stream has already been operated upon or closed”。這說明流不存儲數(shù)據(jù),遍歷完后這個流已經(jīng)被消費(fèi)掉了,而且流不可以重復(fù)使用。

5 流操作與流的使用

將所有的流操作連接起來可以組合成一個管道,管道有兩類操作:中間操作和終端操作。
StreamAPI常用的中間操作有:filter,map,limit,sorted,distinct。

StreamAPI常用的終端操作有:forEach,count,collect。

在使用流的時候,主要需要三個要素:一個用來執(zhí)行查詢的數(shù)據(jù)源,用來形成一條流的流水線的中間操作鏈,一個能夠執(zhí)行流水線并能生成結(jié)果的終端操作。

下圖展示了流的整個操作流程:

6 總結(jié)

  • 流是從支持?jǐn)?shù)據(jù)處理操作的源生成的元素序列
  • 流的思想類似于生產(chǎn)中的流水線
  • 流不存儲數(shù)據(jù),不改變數(shù)據(jù)源,只能被改變一次
  • 流的操作主要分為中間操作和終端操作兩大類

以上就是聊一聊Java中的Steam流的詳細(xì)內(nèi)容,更多關(guān)于Java Steam流的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 淺談IDEA中Maven配置問題全解決

    淺談IDEA中Maven配置問題全解決

    這篇文章主要介紹了淺談IDEA中Maven配置問題全解決,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-07-07
  • java 實(shí)現(xiàn)反射 json動態(tài)轉(zhuǎn)實(shí)體類--fastjson

    java 實(shí)現(xiàn)反射 json動態(tài)轉(zhuǎn)實(shí)體類--fastjson

    這篇文章主要介紹了java 實(shí)現(xiàn)反射 json動態(tài)轉(zhuǎn)實(shí)體類--fastjson,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-02-02
  • java中常用工具類之字符串操作類和MD5加密解密類

    java中常用工具類之字符串操作類和MD5加密解密類

    這篇文章主要介紹了java中常用工具類之字符串操作類和MD5加密解密類,需要的朋友可以參考下
    2014-07-07
  • 淺談Spring bean 生命周期驗(yàn)證

    淺談Spring bean 生命周期驗(yàn)證

    本篇文章主要介紹了淺談Spring bean 生命周期驗(yàn)證,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-10-10
  • IDEA下從零開始搭建SpringBoot工程的方法步驟

    IDEA下從零開始搭建SpringBoot工程的方法步驟

    這篇文章主要介紹了IDEA下從零開始搭建SpringBoot工程的方法步驟,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2019-01-01
  • Sharding-jdbc報錯:Missing the data source name:‘m0‘解決方案

    Sharding-jdbc報錯:Missing the data source 

    在使用MyBatis-plus進(jìn)行數(shù)據(jù)操作時,新增Order實(shí)體屬性后,出現(xiàn)了數(shù)據(jù)源缺失的提示錯誤,原因是因?yàn)閡serId屬性值使用了隨機(jī)函數(shù)生成的Long值,這與sharding-jdbc的路由規(guī)則計算不匹配,導(dǎo)致無法找到正確的數(shù)據(jù)源,通過調(diào)整userId生成邏輯
    2024-11-11
  • aop注解方式實(shí)現(xiàn)全局日志管理方法

    aop注解方式實(shí)現(xiàn)全局日志管理方法

    下面小編就為大家分享一篇aop注解方式實(shí)現(xiàn)全局日志管理方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-01-01
  • 詳解Spring Cloud Config采用Git存儲時兩種常用的配置策略

    詳解Spring Cloud Config采用Git存儲時兩種常用的配置策略

    這篇文章主要介紹了詳解Spring Cloud Config采用Git存儲時兩種常用的配置策略,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-07-07
  • Java中id,pid格式數(shù)據(jù)轉(zhuǎn)樹和森林結(jié)構(gòu)工具類實(shí)現(xiàn)

    Java中id,pid格式數(shù)據(jù)轉(zhuǎn)樹和森林結(jié)構(gòu)工具類實(shí)現(xiàn)

    本文主要介紹了Java中id,pid格式數(shù)據(jù)轉(zhuǎn)樹和森林結(jié)構(gòu)工具類實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-05-05
  • Java接口的回調(diào)機(jī)制的實(shí)現(xiàn)

    Java接口的回調(diào)機(jī)制的實(shí)現(xiàn)

    本文主要介紹了Java中回調(diào)機(jī)制的實(shí)現(xiàn)方式,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2025-01-01

最新評論