Java8新特性之Stream流對map集合進行修改並且返回新的map


Stream簡介

Java8推出的一個新特性,Stream 作為 Java 8 的一大亮點,它與 java.io 包里的 InputStream 和 OutputStream 是完全不同的概念。它也不同於 StAX 對 XML 解析的 Stream,也不是 Amazon Kinesis 對大數據實時處理的 Stream。Java 8 中的 Stream 是對集合(Collection)對象功能的增強,它專注於對集合對象進行各種非常便利、高效的聚合操作(aggregate operation),或者大批量數據操作 (bulk data operation)。Stream API 借助於同樣新出現的 Lambda 表達式,極大的提高編程效率和程序可讀性。同時它提供串行和並行兩種模式進行匯聚操作,並發模式能夠充分利用多核處理器的優勢,使用 fork/join 並行方式來拆分任務和加速處理過程。

那么到底什么是流呢?

Stream 不是集合元素,它不是數據結構並不保存數據,它是有關算法和計算的,它更像一個高級版本的 Iterator。原始版本的 Iterator,用戶只能顯式地一個一個遍歷元素並對其執行某些操作;高級版本的 Stream,用戶只要給出需要對其包含的元素執行什么操作,比如 “過濾掉長度大於 10 的字符串”、“獲取每個字符串的首字母”等,Stream 會隱式地在內部進行遍歷,做出相應的數據轉換。

Stream 就如同一個迭代器(Iterator),單向,不可往復,數據只能遍歷一次,遍歷過一次后即用盡了,就好比流水從面前流過,一去不復返。

而和迭代器又不同的是,Stream 可以並行化操作,迭代器只能命令式地、串行化操作。顧名思義,當使用串行方式去遍歷時,每個 item 讀完后再讀下一個 item。而使用並行去遍歷時,數據會被分成多個段,其中每一個都在不同的線程中處理,然后將結果一起輸出。

案例演示

我們可能會在項目中有這樣的需求:將返回的 Map<String,Object>改為Map<String,Object.字段>

下面我將利用stream的peek方法進行轉換操作,什么是peek?

peek 對每個元素執行操作並返回一個新的 Stream。

直接上Demo代碼:

package com.star.util;

import java.util.HashMap;
import java.util.Map;
import java.util.stream.Collectors;

public class Demo {

    static class Student{//只是為了方便演示

        private Integer id;
        private String  name;

        public Integer getId() {
            return id;
        }

        public void setId(Integer id) {
            this.id = id;
        }

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }
        public Student(Integer id, String name) {
            this.id = id;
            this.name = name;
        }
    }

    public static void main(String[] args) {

        //測試數據,實際中map可能來自數據庫或其他方。
        Map<String,Object> map = new HashMap<>();
        map.put("a",new Student(1,"張三"));
        map.put("b",new Student(2,"李四"));
        map.put("c",new Student(3,"王五"));
        map.put("d",new Student(4,"趙六"));

        //需求是將Map<String,Object>改為Map<String,Object.字段>
        Map<String, Object> collect = map.entrySet()//獲取集合
                .stream()//獲取流
                .peek(obj -> obj.setValue(((Student) obj.getValue()).getName()))//peek支持在每個元素上執行一個操作並且返回新的stream
                // ,我們就利用這個方法轉換數據
                .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));//collect方法用來將流轉到集合對象

        //遍歷輸出
        collect.forEach((key,value)->System.out.println(key+":"+value));
    }

}

查看結果

結果

可以看到已經轉為我們想要的數據形式了,關於Stream還有很多非常有用的特性,比如過濾、排序、聚合、匹配等非常方便,建議大家掌握一下。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM