【Java】JDK8新特性(三)stream流

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的资源,确实可以提高效率。

注意:数据量比较少的情况下,不要使用并行流。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值