文章目录
3. stream流
3.1 什么是stream流
Stream 是JDK1.8 中处理集合的关键抽象概念,Lambda 和 Stream 是JDK1.8新增的函数式编程最有亮点的特性了,它可以指定你希望对集合进行的操作,可以执行非常复杂的查找、过滤和映射数据等操作。使用Stream API 对集合数据进行操作,就类似于使用SQL执行的数据库查询。Stream 使用一种类似用 SQL 语句从数据库查询数据的直观方式来提供一种对 Java 集合运算和表达的高阶抽象。Stream API可以极大提高Java程序员的生产力,让程序员写出高效率、干净、简洁的代码。
这种风格将要处理的元素集合看作一种流, 流在管道中传输, 并且可以在管道的节点上进行处理, 比如筛选, 排序,聚合等。
元素流在管道中经过中间操作(intermediate operation)的处理,最后由最终操作(terminal operation)得到前面处理的结果。
一次stream流操作中中间操作必须在终止操作前, 否则将报错
中间操作间也有 顺序关系 , 顺序不同结果不同
3.2 创建方式
parallelStream为并行流采用多线程执行
Stream采用单线程执行
parallelStream效率比Stream要高
List<User> userList = new ArraryList<>();
//stream流
Stream<User> stream = userList.stream();
//parallelStream流
Stream<User> stream = userList.parallelStream();
3.3 基本操作
3.3.1 将List转换为Set
Stream<User> stream = user.stream();
//将集合转为Set
Set<UserEntity> collectSet = stream.collect(Collectors.toSet());
System.out.println(collectSet);
关于集合的去重的底层原理依赖于数据元素的equals方法和hashCode方法, 想要根据自己的想法去重需要在数据元素类中重写这两个方法
3.3.1 将List转换为Map
Stream<User> stream = user.stream();
Stream<User> stream = users.stream();
//toMap方法中重写的第一个方法为user实例与Map中key的映射关系,第二个为于value的映射关系
Map<String, User> collect = stream.collect(Collectors.toMap(user -> user.username, user -> user));
System.out.println(collect);
注意Map中的key不可以重复
3.3.2 Stream将Reduce 求和
Stream<Integer> integerStream = Stream.of(10, 30, 80, 60, 10, 70);
//重写方法意义为前后参数的作用关系 这里返回的是他们的和来对流中数据求和
Optional<Integer> reduce = integerStream.reduce((integer, integer2) -> integer + integer2);
System.out.println(reduce.get());
3.3.3 Max和Min
Stream<User> stream = users.stream();
//重写Comparator类中compare方法
Optional<User> max = stream.max(((o1, o2) -> o1.age - o2.age));
Stream<User> stream = users.stream();
//重写Comparator类中compare方法
Optional<User> min = stream.min(((o1, o2) -> o1.age - o2.age));
3.3.4 limit和skip
limit 从头开始获取
skip 就是跳过
//中间操作有顺序关系,表示跳过流中前2个数据元素后,选取1个, 对结果遍历输出
stream.skip(2).limit(1).forEach(userEntity -> System.out.println(userEntity));
3.3.5 并行流与串行流区别
串行流:单线程的方式操作; 数据量比较少的时候。
并行流:多线程方式操作;数据量比较大的时候,原理:Fork join 将一个大的任务拆分n多个小的子任务并行执行,最后在统计结果,有可能会非常消耗cpu的资源,确实可以提高效率。
注意:数据量比较少的情况下,不要使用并行流。