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

Java8新特性stream和parallelStream區(qū)別

 更新時(shí)間:2023年12月20日 09:26:49   作者:吳名氏.  
這篇文章主要介紹了Java8新特性stream和parallelStream區(qū)別,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

1 stream和parallelStream的區(qū)別

1.Stream 是在 Java8 新增的特性,普遍稱其為流;它不是數(shù)據(jù)結(jié)構(gòu)也不存放任何數(shù)據(jù),其主要用于集合的邏輯處理。

2.Stream流是一個(gè)集合元素的函數(shù)模型,它并不是集合,也不是數(shù)據(jù)結(jié)構(gòu),其本身并不存儲(chǔ)任何元素(或其地址值),它只是在原數(shù)據(jù)集上定義了一組操作。

3.Stream流不保存數(shù)據(jù),Stream操作是盡可能惰性的,即每當(dāng)訪問到流中的一個(gè)元素,才會(huì)在此元素上執(zhí)行這一系列操作。

4.Stream流不會(huì)改變?cè)袛?shù)據(jù),想要拿到改變后的數(shù)據(jù),要用對(duì)象接收。

串行流stream:串行處理數(shù)據(jù),不產(chǎn)生異步線程。
并行流parallelStream:parallelStream提供了流的并行處理,它是Stream的另一重要特性,其底層使用Fork/Join框架實(shí)現(xiàn)。簡(jiǎn)單理解就是多線程異步任務(wù)的一種實(shí)現(xiàn)。

建議:數(shù)據(jù)量不大的情況下建議使用stream即可,不要盲目大量使用parallelStream,因?yàn)閜arallelStream是多線程異步的,也就是說會(huì)產(chǎn)生多線程,消耗內(nèi)存不說,說不定還會(huì)更慢,并非一定會(huì)更快更好。

2 常用方法介紹

2.1 groupingBy方法

主要是轉(zhuǎn)化數(shù)據(jù)為Map,value是符合條件的集合

List<Admin> adminList = adminMapper.selectList(null);
Map<Long, List<Admin>> adminMap = adminList.stream().collect(Collectors.groupingBy(Admin::getId));

2.2 toMap方法

主要是轉(zhuǎn)化數(shù)據(jù)為Map,value是該條記錄或字段值

List<Admin> adminList = adminMapper.selectList(null);
Map<Long, String> adminMap = adminList.stream().collect(Collectors.toMap(Admin::getId, Admin::getRealName, (key1, key2) -> key1));

2.3 filter方法

主要是用來篩選數(shù)據(jù)的

List<Admin> adminList = adminMapper.selectList(null);
adminList = adminList.stream().filter(admin -> admin.getAdminState() != null).collect(Collectors.toList());

2.4 anyMatch方法

用于判斷數(shù)據(jù),只要有一個(gè)條件滿足即返回true

List<Admin> adminList = adminMapper.selectList(null);
boolean isAdmin = adminList.stream().anyMatch(admin -> admin.getAdminState() != null);

2.5 allMatch方法

用于判斷數(shù)據(jù),必須全部都滿足才會(huì)返回true

List<Admin> adminList = adminMapper.selectList(null);
boolean isAdmin = adminList.stream().allMatch(admin -> admin.getAdminState() != null);

2.6 noneMatch方法

用于判斷數(shù)據(jù),全都不滿足才會(huì)返回true

List<Admin> adminList = adminMapper.selectList(null);
boolean isAdmin = adminList.stream().noneMatch(admin -> admin.getAdminState() != null);

2.7 map方法

一般用于獲取屬性值

List<Admin> adminList = adminMapper.selectList(null);
List<Long> adminIdList = adminList.stream().map(Admin::getId).collect(Collectors.toList());

2.8 peek方法

一般用于改變數(shù)據(jù),但是官方不建議使用

List<Admin> adminList = adminMapper.selectList(null);
adminList = adminList.stream().peek(admin -> admin.setAdminState(null)).collect(Collectors.toList());

3 使用parallelStream注意事項(xiàng)

1.parallelStream是線程不安全的。

2.parallelStream適用的場(chǎng)景是CPU密集型的,只是做到別浪費(fèi)CPU,假如本身電腦CPU的負(fù)載很大,那還到處用并行流,那并不能起到作用。I/O密集型 磁盤I/O、網(wǎng)絡(luò)I/O都屬于I/O操作,這部分操作是較少消耗CPU資源,一般并行流中不適用于I/O密集型的操作,就比如使用并流行進(jìn)行大批量的消息推送,涉及到了大量I/O,使用并行流反而慢了很多。

3.在使用并行流的時(shí)候是無法保證元素的順序的,也就是即使你用了同步集合也只能保證元素都正確但無法保證其中的順序。

4 實(shí)戰(zhàn)比較

4.1 代碼如下

    /**
     * parallelStream()和stream()執(zhí)行速度測(cè)試
     */
    @Test
    public void test6() {
        List<Integer> a = new ArrayList<>();
        for (int i = 0 ; i < 1000 ; i++) {
            a.add(i);
        }
        long b = System.currentTimeMillis();
        a.parallelStream().forEach(obj->{
            try {
                Thread.sleep(100);
            } catch (InterruptedException e) {
                log.error("出錯(cuò):", e);
            }
            System.out.println(obj);
        });
        long c = System.currentTimeMillis();
        long d = System.currentTimeMillis();
        a.stream().forEach(obj->{
            try {
                Thread.sleep(100);
            } catch (InterruptedException e) {
                log.error("出錯(cuò):", e);
            }
            System.out.println(obj);
        });
        long e = System.currentTimeMillis();
        System.out.println("并行耗時(shí):" + (c-b));
        System.out.println("串行耗時(shí):" + (e-d));
    }

4.2 執(zhí)行結(jié)果

5 結(jié)論

由上述執(zhí)行結(jié)果可知,parallelStream在同時(shí)執(zhí)行一些耗時(shí)的方法時(shí),執(zhí)行時(shí)間要優(yōu)于stream,但是使用時(shí)需要注意一些注意事項(xiàng)

到此這篇關(guān)于Java8新特性stream和parallelStream區(qū)別的文章就介紹到這了,更多相關(guān)Java8 stream parallelStream內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • SpringBoot?pdf打印及預(yù)覽(openhtmltopdf+freemarker)

    SpringBoot?pdf打印及預(yù)覽(openhtmltopdf+freemarker)

    這篇文章主要介紹了SpringBoot?pdf打印及預(yù)覽(openhtmltopdf+freemarker)
    2023-05-05
  • jasypt dubbo配置密文存放使用詳解

    jasypt dubbo配置密文存放使用詳解

    這篇文章主要介紹了jasypt dubbo配置密文存放使用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-12-12
  • 淺談關(guān)于Mybatis的mapper-locations配置問題

    淺談關(guān)于Mybatis的mapper-locations配置問題

    MyBatis 是一款優(yōu)秀的半自動(dòng)的ORM持久層框架,它支持自定義 SQL、存儲(chǔ)過程以及高級(jí)映射。MyBatis 免除了幾乎所有的 JDBC 代碼以及設(shè)置參數(shù)和獲取結(jié)果集的工作,需要的朋友可以參考下
    2023-05-05
  • 使用itextpdf操作pdf的實(shí)例講解

    使用itextpdf操作pdf的實(shí)例講解

    下面小編就為大家分享一篇使用itextpdf操作pdf的實(shí)例講解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2018-01-01
  • Java數(shù)據(jù)結(jié)構(gòu)與算法之選擇排序(動(dòng)力節(jié)點(diǎn)java學(xué)院整理)

    Java數(shù)據(jù)結(jié)構(gòu)與算法之選擇排序(動(dòng)力節(jié)點(diǎn)java學(xué)院整理)

    這篇文章主要介紹了Java數(shù)據(jù)結(jié)構(gòu)與算法之選擇排序的相關(guān)資料,本文通過代碼講解,非常不錯(cuò),具有參考借鑒價(jià)值,需要的的朋友參考下
    2017-04-04
  • JDBC SQL語法

    JDBC SQL語法

    結(jié)構(gòu)化查詢語言(SQL)是一種標(biāo)準(zhǔn)化的語言,它允許你在數(shù)據(jù)庫上執(zhí)行操作,如創(chuàng)建項(xiàng)目,讀取內(nèi)容,內(nèi)容更新和刪除條目
    2014-03-03
  • mybatis-plus多表聯(lián)查join的實(shí)現(xiàn)

    mybatis-plus多表聯(lián)查join的實(shí)現(xiàn)

    本文主要介紹了mybatis-plus多表聯(lián)查join的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-01-01
  • 淺談java中String StringBuffer StringBuilder的區(qū)別

    淺談java中String StringBuffer StringBuilder的區(qū)別

    下面小編就為大家?guī)硪黄獪\談java中String StringBuffer StringBuilder的區(qū)別。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2016-06-06
  • spring?boot項(xiàng)目自定義參數(shù)校驗(yàn)規(guī)則示例詳解

    spring?boot項(xiàng)目自定義參數(shù)校驗(yàn)規(guī)則示例詳解

    這篇文章主要介紹了spring boot項(xiàng)目如何自定義參數(shù)校驗(yàn)規(guī)則,自定義校驗(yàn)規(guī)則和自帶的規(guī)則實(shí)現(xiàn)方式一樣,先自定義一個(gè)注解,然后指定校驗(yàn)類,在校驗(yàn)類里實(shí)現(xiàn)具體的校驗(yàn)規(guī)則,本文結(jié)合示例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2023-07-07
  • Java學(xué)習(xí)基礎(chǔ)之安裝JDK/配置JDK環(huán)境&IEDA工具安裝

    Java學(xué)習(xí)基礎(chǔ)之安裝JDK/配置JDK環(huán)境&IEDA工具安裝

    這篇文章主要介紹了Java學(xué)習(xí)基礎(chǔ)系列文章的第一篇,主要內(nèi)容是安裝JDK/配置JDK環(huán)境&IEDA工具安裝的相關(guān)資料,需要的朋友可以參考下
    2020-02-02

最新評(píng)論