流与集合的差异
- 流并不储存其元素,这些元素可能存储于底层的集合中,或者按需生成的
- 流的操作不会修改数据源
- 流的操作是尽可能惰性的,这意味着直至需要其结果时,操作才进行。
流的创建
1 | List<String> list = new ArrayList<>(); |
filter
filter方法产生一个流,其中包含当前流中满足指定条件的所有元素
1 | List<String> list = new ArrayList<>(); |
map
将目标流转化为指定流。
1 | List<String> list = new ArrayList<>(); |
flatMap
1 | <R> Stream<R> flatMap(Function<? super T, ? extends Stream<? extends R>> mapper); |
flatMap与map的区别:
map是将mapper应用于当前流中所有的元素产生的结果,而flatMap是通过将mapper应用于当前流
中所有元素产生的结果连接在一起而获得。
limit、skip和concat
1 | List<String> list = new ArrayList<>(); |
流转换
1 | Stream<T> distinct() //产生一个流,包含原来流中所有不同的元素 |
流操作
1 | List<String> list = new ArrayList<>(); |
Optional
创建Optional:
1 | //of 方法产生具有给定值的Optional |
常用方法:
1 | Optional<String> value = Optional.empty(); |
流转换为集合
1 | //流转化为数组 |
基本类型流
IntStream:可以存储short、char、byte和booleanDoubleStream:存储float和doubleLongStream:存储long
基本类型流的方法和上面介绍的方法类似,下面介绍基本类型流的特有方法
1 | //独有构造方法 |
并行流
1 | //创建并行流 |
并行流正常工作的条件
- 数据应该在内存中,等待数据到达是低效的
- 流一个分为高效的几部分,由数组或平衡二叉树支撑的流都可以正常工作,但是
Stream.iterate不行 - 流操作的工作量应该有很大的规模,不然使用并行流没有意义
- 流操作不应该被堵塞