stream流
Stream是Java 8 API添加的一个新的抽象,称为流Stream,以一种声明性方式处理数据集合(侧重对于源数据计算能力的封装,并且支持序列与并行两种操作方式)
Stream的继承体系
public interface Stream<T> extends BaseStream<T, Stream<T>> {...}
public interface BaseStream<T, S extends BaseStream<T, S>>
extends AutoCloseable {...}
Stream流是从支持数据处理操作的源生成的元素序列,源可以是数组、文件、集合、函数。流不是集合元素,它不是数据结构并不保存数据,它的主要目的在于计算
Stream流是对集合(Collection)对象功能的增强,与Lambda表达式结合,可以提高编程效率、间接性和程序可读性。
特点
- 直接阅读代码的字面意思即可完美展示无关逻辑方式的语义
- Stream流把真正的函数式编程风格引入到Java中
- 代码简洁
流程
- 获取Stream流
- 创建一条流水线,并把数据放到流水线上准备进行操作
- 中间方法
- 流水线上的操作
- 一次操作完毕之后,还可以继续进行其他操作
- 终结方法
- 一个Stream流只能有一个终结方法
- 是流水线上的最后一个操作
获取Stream流
- Collection体系集合
default Stream<E> stream() {
return StreamSupport.stream(spliterator(), false);
}
使用Collection中的默认方法stream获取stream流
- Map体系集合
把Map转换为Set,间接地生成流
- 数组
Arrays.stream()
通过Arrays中的静态方法stream生成流
- 同种数据类型的多个数据
public static<T> Stream<T> of(T... values) {
return Arrays.stream(values);
}
通过Stream接口的静态方法of(T… values)生成流
Stream流中间操作方法
-
常见方法
方法名 说明 Stream filter(Predicate predicate) 用于对流中的数据进行过滤 Stream limit(long maxSize) 返回此流中的元素组成的流,截取前指定参数个数的数据 Stream skip(long n) 跳过指定参数个数的数据,返回由该流的剩余元素组成的流 static Stream concat(Stream a, Stream b) 合并a和b两个流为一个流 Stream distinct() 返回由该流的不同元素(根据Object.equals(Object) )组成的流 Stream map(Function<? super T, ? extends R> mapper); 映射数据类型
方法的返回值是经过操作的Stream,故可以进行链式编程
Stream流终结方法
-
常见方法
方法名 说明 void forEach(Consumer action) 对此流的每个元素执行操作 long count() 返回此流中的元素数
Stream流的收集操作
-
概念
对数据使用Stream流的方式操作完毕后,可以把流中的数据收集到集合中
-
常用方法
方法名 说明 R collect(Collector collector) 把结果收集到集合中 -
工具类Collectors提供了具体的收集方式
方法名 说明 public static Collector toList() 把元素收集到List集合中 public static Collector toSet() 把元素收集到Set集合中 public static Collector toMap(Function keyMapper,Function valueMapper) 把元素收集到Map集合中
代码演示
Vertex类中有一个filed:String label
有一个getter方法getLabel
private final List<Vertex> vertices = new ArrayList<>();
public Set<String> vertices() {
return vertices.stream().map(Vertex::getLabel).collect(Collectors.toSet());
}
vertices.stream() 生成Stream流
.map() 将流中的Vertex类型映射成String类型,就是Vertex里的label
参数应是一个函数式接口实现类对象,可以用lambda表达式或方法引用简化
.collect() 收集流,根据传入的参数返回特定类型的集合
Collectors.toSet() 作为collect的参数,告诉collect方法返回Set