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还有很多非常有用的特性,比如过滤、排序、聚合、匹配等非常方便,建议大家掌握一下。

posted @ 2020-11-19 13:45  _未来可期  阅读(5658)  评论(0编辑  收藏  举报