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
  • @ 先看一下導出的整體效果(如下圖),其中標註的區域都是通過後臺動態生成的: 一、先在Word中建立好表格模板 1.1、參數創建方法(Word和WPS) 1.1.1、Office中Word域的創建 1.1.1.1、選中指定的單元格 -> 點擊頭部工具欄中的”插入“ -> 選擇 ”文檔部件“ -> 選 ...
  • 在實際工作中,經常會有一些需要定時操作的業務,如:定時發郵件,定時統計信息等內容,那麼如何實現才能使得我們的項目整齊劃一呢?本文通過一些簡單的小例子,簡述在.Net6+Quartz實現定時任務的一些基本操作,及相關知識介紹,僅供學習分享使用,如有不足之處,還請指正。 ...
  • 紙殼CMS支持將評論、留言、表單提交、訂閱等通知,通過WebHook發送到第三方平臺,比如釘釘。 創建釘釘WebHook 需要在釘釘群中創建自定義機器人,具體方法可以參考釘釘的官方文檔: 自定義機器人接入 需要註意的是,在安全設置中不要使用加簽,使用自定義關鍵字即可。在發送的消息中,只要包含這個關鍵 ...
  • 向下轉型的使用 Java的多態性: 父類指向子類的聲明 Animal animal = new Dog()//Dog()重寫了父類Animal 有了對象的多態性以後,記憶體實際上載入的是==子類==的屬性和方法,但是由於變數聲明為==父類類型==,導致編譯時只能調用父類的屬性和方法,子類特有的屬性方法 ...
  • spring源碼環境搭建 組件 版本 jdk 1.8.0_192 spring-framework 5.3.x gradle 7.5.1 idea 2022.3.3 aspectJ 1.9 可根據spring-framwork項目說明靈活選擇 一、拉取spring-framework項目 1、spr ...
  • 首先任何的商業邏輯,光流量增長,沒法變現是沒用的。 就像博客群發提效工具,得有對應的用戶,更得有對應付費用戶群體的畫像。剩下的就是靠增長,被動讓他們找到你的產品,用產品解決他們痛點,他們自然而然會付費。 下麵大致分享下從三個方向分享下: 用戶痛點 -> 真正的付費用戶群體 產品價值 PLG 增長 一 ...
  • Object類的使用 Object類 Object類中的方法可以在網上搜索得到 Object類是所有java類的父類 如果類在聲明中未使用extends關鍵字指明其父類,則預設父類為java.lang.Object類 Object類中的功能(屬性、方法)具有通用性。 屬性:無 方法:equals() ...
  • Qt 源碼分析之moveToThread 這一次,我們來看Qt中關於將一個QObject對象移動至一個線程的函數moveToThread Qt使用線程的基本方法 首先,我們簡單的介紹一下在Qt中使用多線程的幾種方法: 重寫QThread的run函數,將要在多線程執行的任務放到run函數里 /*myt ...
  • 包裝類的使用 包裝類的使用 java提供8種基本數據類型對應的包裝類,使得基本數據類型變數具有類的特征 掌握:==基本數據類型、包裝類、String==三者之間的互相轉換 自動裝箱與自動拆箱==[基本數據類型和包裝類的轉換]== JDK5.0新特性,自動裝箱與自動拆箱。 class Test{ pu ...
  • 本文已經收錄到Github倉庫,該倉庫包含電腦基礎、Java基礎、多線程、JVM、資料庫、Redis、Spring、Mybatis、SpringMVC、SpringBoot、分散式、微服務、設計模式、架構、校招社招分享等核心知識點,歡迎star~ Github地址 大家好,我是大彬~ 今天來聊聊接 ...