Java8Stream流

来源:https://www.cnblogs.com/huoyl/archive/2022/09/25/Java8_Stream.html
-Advertisement-
Play Games

Stream流呢,以前我也有所瞭解,像一些面試題中也出現過,Java8的新特性,有一塊就是這個Stream操作集合,而且在看一些項目中也使用的比較多。但總感覺自己學的一知半解,所以今天打算系統的過一下,再鞏固鞏固。 ###概念 Stream是JDK8 API中的新成員,它允許以聲明性方式處理集合。 ...


Stream流呢,以前我也有所瞭解,像一些面試題中也出現過,Java8的新特性,有一塊就是這個Stream操作集合,而且在看一些項目中也使用的比較多。但總感覺自己學的一知半解,所以今天打算系統的過一下,再鞏固鞏固。

概念

Stream是JDK8 API中的新成員,它允許以聲明性方式處理集合。

流程

1、把集合轉換為流Stream
2、操作Stream流

Stream流在管道中經過中間操作(intermediate operation)的處理,最後由最終操作(terminal operation)得到前面處理的結果

一些常見的中間操作和中止操作

  1. 中間操作(過濾、映射、限制...),可以多個
方法名 方法作用 返回值類型 方法類型
filter 過濾 Stream 中間操作
map 映射(轉換)接收一個函數作為參數,這個函數會被應用到每個元素上,並將其映射成為一個新的元素 Stream 中間操作
peek 窺探 Stream 中間操作
skip 跳過前幾個 Stream 中間操作
limit 截取前幾個 Stream 中間操作
distinct 去重操作(比較的是地址) Stream 中間操作
sorted 排序操作 Stream 中間操作
  1. 終止操作(最常見的是收集),只可以設置1個
方法名 方法作用 返回值類型 方法類型
collect 收集處理結果 泛型 終止操作
count 統計個數 long 終止操作
forEach 逐一處理 void 終止操作
reduce 彙總操作 Optional<> 該對象有get方法可以獲取返回值 終止操作

Stream的3個註意事項:

  • Stream中間操作方法返回的是新的流
  • Stream不調用終結方法,中間的操作不會執行
  • Stream只能調用一次終止操作。得到結果後,不能再次使用這個流。
下麵是一些小demo
點擊查看代碼
/**
     * 過濾集合中不符合條件的元素
     */
    @Test
    public void testfilter(){
        List<String> stringList = Arrays.asList("abc", "", "bc", "def", "abcd", "", "jkl");
        List<String> aList = stringList.stream().filter(str -> str.contains("a")).collect(Collectors.toList());
        aList.forEach(System.err::println);
    }

    /**
     *去重
     */
    @Test
    public void testDistinct(){
        List<String> stringList = Arrays.asList("abc", "", "bc", "def", "abcd", "", "jkl","jkl");
        List<String> distinctStr = stringList.stream().distinct().collect(Collectors.toList());
        distinctStr.forEach(System.out::println);
        //--------------------------------
        Product prod1 = new Product(1L, 1, new BigDecimal("15.5"), "麵包", "零食");
        Product prod2 = new Product(2L, 2, new BigDecimal("20"), "餅干", "零食");
        Product prod3 = new Product(2L, 2, new BigDecimal("20"), "餅干", "零食");
        ArrayList<Product> proList = Lists.newArrayList(prod1, prod2, prod3);
        List<Product> distinctProList = proList.stream().distinct().collect(Collectors.toList());
        distinctProList.forEach(System.out::println);
    }

    /**
     * limit(n)獲取流中的前n個元素
     */
    @Test
    public void testLimit(){
        List<String> stringList = Arrays.asList("abc", "", "bc", "def", "abcd", "", "jkl","jkl");
        List<String> limitStr = stringList.stream().limit(3).collect(Collectors.toList());
        System.out.println(limitStr);
    }

    /**
     * skip(n)
     */
    @Test
    public void testSkip(){
        List<String> stringList = Arrays.asList("abc", "", "bcd", "def", "abcd", "", "jkl","jkl");
        List<String> skipStrList = stringList.stream().skip(2).collect(Collectors.toList());
        System.out.println(skipStrList);
    }

    /**
     * map() 接收一個函數作為參數,這個函數會被應用到每個元素上,並將其映射成為一個新的元素
     */
    @Test
    public void testMap(){
        List<String> stringList = Arrays.asList("abc", "", "bcd", "def", "abcd", "", "jkl","jkl");
        List<String> mapStrList = stringList.stream().map(str -> str.concat("_map")).collect(Collectors.toList());
        System.out.println(mapStrList);
    }

    @Test
    public void testSorted(){
        List<String> stringList = Arrays.asList("abc", "", "bcd", "def", "abcd", "", "jkl","jkl");
        List<String> sortedStrList = stringList.stream().sorted().collect(Collectors.toList());
        System.out.println(sortedStrList);
    }

    /**
     * collect():將流轉換為其他形式 list set map
     */
    @Test
    public void testCollect(){
        List<String> stringList = Arrays.asList("abc", "", "bcd", "def", "abcd", "", "jkl","jkl");
        Set<String> collectSet = stringList.stream().collect(Collectors.toSet());
        System.out.println(collectSet);
    }

    /**
     * 將流中元素反覆結合起來得到一個結果
     */
    @Test
    public void testReduce(){
        List<String> stringList = Arrays.asList("abc", "", "bcd", "def", "abcd", "", "jkl","jkl");
        Optional<String> reduce = stringList.stream().reduce((acc, item) -> {return acc + item;});
        if (reduce.isPresent()) System.out.println(reduce.get());
    }

    /**
     * 將流中元素反覆結合起來得到一個結果
     */
    @Test
    public void testCount(){
        List<String> stringList = Arrays.asList("abc", "", "bcd", "def", "abcd", "", "jkl","jkl");
        long count = stringList.stream().count();
        System.out.println(count);
    }

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 簡介 對於大部分系統來說,創建對象包括申請記憶體、給成員變數賦值等過程,這些操作耗費的時間基本可以忽略不計。 如果對象中的數據需要經過複雜的計算才能得到(比如排序、計算哈希值),或者需要從 RPC、網路、資料庫、文件系統等非常慢速的 IO 中讀取,這其中耗費的時間有時是無法容忍的。 如果對象的創建成本 ...
  • 建造者模式 介紹 建造者模式註重的是部件構建的過程,意在通過一步一步地精確構造出一個複雜的對象。 可以將建造者模式理解為,假設我們有一個對象需要建立,這個對象是由多個組件(Component)組合而成,每個組件的建立都比較複雜,但運用組件來建立所需的組件對象非常簡單,所以我們就可以將構建複雜組件的步 ...
  • 在創建型模式中,工廠模式是我們日常使用最為頻繁的設計模式之一。工廠模式可細分為簡單工廠模式、工廠方法模式、抽象工廠模式。 簡單工廠模式 模式簡介 簡單工廠模式:根據參數返回不同類的實例,這些類通常具有共同的父類。 簡單工廠模式包括三個角色: 工廠 (Factory):用於創建所需產品,提供靜態工廠方 ...
  • 編程教材 《R語言實戰·第2版》Robert I. Kabacoff 課程教材《商務與經濟統計·原書第13版》 (安德森) P48、案例2-1 Pelican 商店 PS C:\Users\小能喵喵喵\Desktop\R\homework\1_Pelican> tree /f C:. │ pelic ...
  • 安裝最新版 R-4.2.1 R: The R Project for Statistical Computing (r-project.org) 有大量鏡像供選擇下載,找中國地區鏡像下載會快一點。安裝一口氣Next到底。 https://cran.rstudio.com/bin/windows/Rt ...
  • 簡述 類型:結構型 目的:降低對象創建時大量屬性也隨之被新建而帶來的性能上的消耗 話不多說,我們看一個案例。 優化案例 最初版v0 現在需要採購一批辦公用的電腦,以下是Computer類的定義。 class Computer { private String sn; // 序列號,電腦的唯一識別碼 ...
  • 探索密碼學的奇妙之旅。介紹分組密碼常用模式CFB密文反饋模式的相關理論。並基於AES標準,使用golang crypto包的cipher模塊實現了加密、解密字元串的過程。 ...
  • 七牛雲文件上傳 @RequestMapping("/upload") public Result upload(MultipartFile imgFile) { try { //獲取原始文件名 String originalFilename = imgFile.getOriginalFilename ...
一周排行
    -Advertisement-
    Play Games
  • 前言 當別人做大數據用Java、Python的時候,我使用.NET做大數據、數據挖掘,這確實是值得一說的事。 寫的並不全面,但都是實際工作中的內容。 .NET在大數據項目中,可以做什麼? 寫腳本(使用控制台程式+頂級語句) 寫工具(使用Winform) 寫介面、寫服務 使用C#寫代碼的優點是什麼? ...
  • 前言 本文寫給想學C#的朋友,目的是以儘快的速度入門 C#好學嗎? 對於這個問題,我以前的回答是:好學!但仔細想想,不是這麼回事,對於新手來說,C#沒有那麼好學。 反而學Java還要容易一些,學Java Web就行了,就是SpringBoot那一套。 但是C#方向比較多,你是學控制台程式、WebAP ...
  • 某一日晚上上線,測試同學在回歸項目黃金流程時,有一個工單項目介面報JSF序列化錯誤,馬上升級對應的client包版本,編譯部署後錯誤消失。 線上問題是解決了,但是作為程式員要瞭解問題發生的原因和本質。但這都是為什麼呢? ...
  • 本文介紹基於Python語言中TensorFlow的Keras介面,實現深度神經網路回歸的方法。 1 寫在前面 前期一篇文章Python TensorFlow深度學習回歸代碼:DNNRegressor詳細介紹了基於TensorFlow tf.estimator介面的深度學習網路;而在TensorFl ...
  • 前段時間因業務需要完成了一個工作流組件的編碼工作。藉著這個機會跟大家分享一下整個創作過程,希望大家喜歡,組件暫且命名為"easyFlowable"。 接下來的文章我將從什麼是工作流、為什麼要自研這個工作流組件、架構設計三個維度跟大家來做個整體介紹。 ...
  • 1 簡介 我們之前使用了dapr的本地托管模式,但在生產中我們一般使用Kubernetes托管,本文介紹如何在GKE(GCP Kubernetes)安裝dapr。 相關文章: dapr本地托管的服務調用體驗與Java SDK的Spring Boot整合 dapr入門與本地托管模式嘗試 2 安裝GKE ...
  • 摘要:在jvm中有很多的參數可以進行設置,這樣可以讓jvm在各種環境中都能夠高效的運行。絕大部分的參數保持預設即可。 本文分享自華為雲社區《為什麼需要對jvm進行優化,jvm運行參數之標準參數》,作者:共飲一杯無。 我們為什麼要對jvm做優化? 在本地開發環境中我們很少會遇到需要對jvm進行優化的需 ...
  • 背景 我們的業務共使用11台(阿裡雲)伺服器,使用SpringcloudAlibaba構建微服務集群,共計60個微服務,全部註冊在同一個Nacos集群 流量轉發路徑: nginx->spring-gateway->業務微服務 使用的版本如下: spring-boot.version:2.2.5.RE ...
  • 基於php+webuploader的大文件分片上傳,帶進度條,支持斷點續傳(刷新、關閉頁面、重新上傳、網路中斷等情況)。文件上傳前先檢測該文件是否已上傳,如果已上傳提示“文件已存在”,如果未上傳則直接上傳。視頻上傳時會根據設定的參數(分片大小、分片數量)進行上傳,上傳過程中會在目標文件夾中生成一個臨 ...
  • 基於php大文件分片上傳至七牛雲,使用的是七牛雲js-sdk V2版本,引入js文件,配置簡單,可以暫停,暫停後支持斷點續傳(刷新、關閉頁面、重新上傳、網路中斷等情況),可以配置分片大小和分片數量,官方文檔https://developer.qiniu.com/kodo/6889/javascrip ...