zoukankan      html  css  js  c++  java
  • 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还有很多非常有用的特性,比如过滤、排序、聚合、匹配等等这里不做过多展开,感兴趣的话我推荐一个来自IBM的官方文章:Java8中Stream API详解

  • 相关阅读:
    jQuery中常用方法和jQuery思维导图
    jQuery
    JS-AJAX and jQuery-AJAX
    Linux系统里导入maven项目
    maven项目里的ssh框架整合
    spring框架的两大核心:IOC和AOP
    JAVA的抽象类和接口
    JAVA面向对象的三大特征
    JAVA---面向对象
    JAVA---方法
  • 原文地址:https://www.cnblogs.com/StarChen20/p/14005122.html
Copyright © 2011-2022 走看看