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详解

  • 相关阅读:
    Learn Prolog Now 翻译
    Learn Prolog Now 翻译
    Learn Prolog Now 翻译
    Learn Prolog Now 翻译
    Learn Prolog Now 翻译
    Learn Prolog Now 翻译
    Learn Prolog Now 翻译
    Learn Prolog Now 翻译
    Learn Prolog Now 翻译
    Learn Prolog Now 翻译
  • 原文地址:https://www.cnblogs.com/StarChen20/p/14005122.html
Copyright © 2011-2022 走看看