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
  • 背景 在瀏覽器中訪問本地靜態資源html網頁時,可能會遇到跨域問題如圖。 是因為瀏覽器預設啟用了同源策略,即只允許載入與當前網頁具有相同源(協議、功能變數名稱和埠)的內容。 WebView2預設情況下啟用了瀏覽器的同源策略,即只允許載入與主機相同源的內容。所以如果我們把靜態資源發佈到iis或者通過node ...
  • 最近看幾個老項目的SQL條件中使用了1=1,想想自己也曾經這樣寫過,略有感觸,特別拿出來說道說道。編寫SQL語句就像炒菜,每一種調料的使用都會影響菜品的最終味道,每一個SQL條件的加入也會影響查詢的執行效率。那麼 1=1 存在什麼樣的問題呢?為什麼又會使用呢? ...
  • 好久不見,我又回來了。 給大家分享一個我最近使用c#代碼操作ftp伺服器的代碼示例: 1 public abstract class FtpOperation 2 { 3 /// <summary> 4 /// FTP伺服器地址 5 /// </summary> 6 private string f ...
  • 一:背景 1. 講故事 過年喝了不少酒,腦子不靈光了,停了將近一個月沒寫博客,今天就當新年開工寫一篇吧。 去年年初有位朋友找到我,說他們的系統會偶發性崩潰,在網上也發了不少帖子求助,沒找到自己滿意的答案,讓我看看有沒有什麼線索,看樣子這是一個牛皮蘚的問題,既然對方有了dump,那就分析起來吧。 二: ...
  • 自己製作的一個基於Entity Framework Core 的資料庫操作攔截器,可以列印資料庫執行sql,方便開發調試,代碼如下: /// <summary> /// EF Core 的資料庫操作攔截器,用於在資料庫操作過程中進行日誌記錄和監視。 /// </summary> /// <remar ...
  • 本文分享自華為雲社區《Go併發範式 流水線和優雅退出 Pipeline 與 Cancellation》,作者:張儉。 介紹 Go 的併發原語可以輕鬆構建流數據管道,從而高效利用 I/O 和多個 CPU。 本文展示了此類pipelines的示例,強調了操作失敗時出現的細微之處,並介紹了乾凈地處理失敗的 ...
  • 在上篇文章中,我們介紹到在多線程環境下,如果編程不當,可能會出現程式運行結果混亂的問題。出現這個原因主要是,JMM 中主記憶體和線程工作記憶體的數據不一致,以及多個線程執行時無序,共同導致的結果。 ...
  • 1、下載安裝包首先、進入官網下載安裝包網址:https://www.python.org/downloads/windows/下載步驟:進入下載地址,根據自己的電腦系統選擇相應的python版本 選擇適配64位操作系統的版本(查看自己的電腦操作系統版本), 點擊下載安裝包 也可以下載我百度雲分享的安 ...
  • 簡介 git-commit-id-maven-plugin 是一個maven 插件,用來在打包的時候將git-commit 信息打進jar中。 這樣做的好處是可以將發佈的某版本和對應的代碼關聯起來,方便查閱和線上項目的維護。至於它的作用,用官方說法,這個功能對於大型分散式項目來說是無價的。 功能 你 ...
  • 序言 在數字時代,圖像生成技術正日益成為人工智慧領域的熱點。 本討論將重點聚焦於兩個備受矚目的模型:DALL-E和其他主流AI繪圖方法。 我們將探討它們的優勢、局限性以及未來的發展方向。通過比較分析,我們期望能夠更全面地瞭解這些技術,為未來的研究和應用提供啟示。 Q: 介紹一下 dall-e Ope ...