概念
<b>Stream是对集合操作的增强</b>,流不是集合的元素,不是一种数据结构 ,不负责数据的存储<br>流更像是一个迭代器,可以<b>单向的遍历</b>一个集合中的每一个元素 ,并且不可循环【<b>数据源</b>】
为什么要用流式编程?
对集合中元素进行操作的时候需要用到其他操作的结果,流式编程可以大幅度简化代码的数量
将数据源中的数据读到一个流中,可以对流进行过滤、映射等操作,每次的操作结果也是一个流对象
获取数据源
通过Collection接口中的<b>stream()</b>方法<br>获取数据源为集合的流对象【同步流】
Stream<Integer> stream = list.stream();
通过Collection接口中的<b>parallelStream()</b>方法<br>获取数据源为集合的流对象【并发、异步流】
Stream<Integer> stream = list.parallelStream();
通过Arrays工具类中的stream()方法<br>获取数据源为数组的流
IntStream stream = Arrays.stream(array) ;
最终操作
最终操作执行结束后,会关闭这个流,流中的所有数据都会销毁
collect
将流中的数据收集到一起,最常见的就是将流中的数据存入集合
List<Integer> result = list.stream.collect(Collectors.toList());
Set<Integer> result = list.stream.collect(Collectors.toSet());
Map<String,Integer> result = list.stream.collect(Collectors.toMap(ele -> ele.toString(), ele -> ele));
reduce
将流中的数据按照一定的规则聚合起来
int result = list.stream().reduce((e1,e2) -> e1+e2).get();
等价于 reduce(Integer::sum).get();
count
统计流中的元素数量
int num = list.stream().count();
forEach
迭代、遍历流中的数据
list.stream().forEach(System.out::println);
max & min
获取流中的最大/最小元素
list.stream().max(Integer::compareTo).get();
Matching
allMatch:只有当流中所有的元素,都匹配指定的规则,才会返回 true
anyMatch:只要流中有任意的数据,满足指定的规则,都会返回 true
noneMatch:只有当流中的所有的元素,都不满足指定的规则,才会返回 true
find
findFirst:从流中获取第一个元素
findAny:从流中获取任意一个元素
中间操作
中间操作就是对流中的数据进行各种各样的处理,可以连续操作,每个操作的返回值都是stream对象
filter
条件过滤,仅保留流中满足指定条件的数据,其他不满足的数据都会被删除
list.stream().filter(ele -> ele.length() > 5).forEach(System.out::println);
distinct
去除集合中重复的元素。这个方法没有参数。去重的规则与HashSet相同
list.stream().distinct().forEach(System.out::println);
sorted
将流中的数据进行排序
默认排序
list.stream().sorted().forEach(System.out::println);
自定义排序
list.stream().sorted((e1, e2) -> e1.length() - e2.length()).forEach(System.out::println);
limit & skip
limit:限制,截取流中开头指定数量的元素
list.stream().limit(3).forEach(System.out::println);
skip:跳过,跳过流中的指定数量的元素
list.stream().skip(3).forEach(System.out::println);
配合使用,截取中间部分元素
list.stream().skip(5).limit(2).forEach(System.out::println);
map & flatMap
map:对流中的数据进行映射,用新的数据替换旧的数据
list.stream().map(ele -> ele+".txt").forEach(System.out::println);
flatMap:扁平化映射,将字符串数组转化为一个个的字符
Arrays.stream(array).map(s -> s.split("")).flatMap(Arrays::stream).forEach(System.out::println);
mapToInt
将流中的数据替换成int类型,此时得到 IntStream 结果
double avg = list.stream().mapToInt(Person::getAge).average().getAsDouble();