赞
踩
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详解。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。