文章目录

  • foreach
    • 使用 forEach操作集合每个元素对象
      • 操作集合元素,方法体只有一行代码
      • 操作集合元素,有方法体
  • filter
    • 统计集合中符合特定条件的数量
  • max和min
    • 获取 String 集合中最长的元素
    • 获取 Integer 集合中的最大值
    • 对象类型的比较
  • map/flatMap
    • 英文字符串数组的元素全部改为大写
    • flatMap将两个字符数组合并成一个新的字符数组
  • reduce
    • reduce进行求和、求乘积的方式
  • 统计(count/averaging)
  • 分组(partitioningBy/groupingBy)
    • 根据员工的level进行分组
  • 接合(joining)
    • 将员工列表的姓名使用特定符号拼接成字符串
  • 排序(sorted)
    • 根据工资倒序排列

foreach

使用 forEach操作集合每个元素对象

dataVoList.stream().forEach();可以简化为dataVoList.forEach

操作集合元素,方法体只有一行代码

        List<DataVo> dataVoList = DataVo.dataVoList;//forEach操作dataVoList.forEach(p-> p.setDesc("描述信息"));//打印输出dataVoList.forEach(System.out::println);

操作集合元素,有方法体

        List<DataVo> dataVoList = DataVo.dataVoList;//forEach操作dataVoList.forEach(p->{p.setDesc("描述信息");p.setCreateTime(new Date());});//打印输出dataVoList.forEach(System.out::println);

filter

统计集合中符合特定条件的数量

计算 Integer 集合中大于 6 的元素的个数

  /**** 统计集合中符合特定条件的数量* 1:过滤条件* 2:完成统计计数**/@Testpublic  void test6(){//计算 Integer 集合中大于 6 的元素的个数。List<Integer> list = Arrays.asList(7, 6, 4, 8, 2, 11, 9);long count = list.stream().filter(p -> p > 6).count();System.out.println(count);}

max和min

获取 String 集合中最长的元素

  /*** 获取 String 集合中最长的元素*/@Testpublic void test3() {List<String> list = Arrays.asList("111", "222", "333", "4234224324", "5435435");Optional<String> max = list.stream().max(Comparator.comparing(String::length));System.out.println(max);}

获取 Integer 集合中的最大值

    /*** 获取 Integer 集合中的最大值**/@Testpublic  void test4(){List<Integer> list = Arrays.asList(2, 22,3443,666,111,-2);Optional<Integer> max = list.stream().max(Comparator.comparingInt(Integer::intValue));System.out.println(max);}

对象类型的比较

    /*** 对象类型的比较* 【示例】* 1:首先根据工资进行比较,返回最高的那个* 2:如果工资相同,在根据职级比较,俩个条件都是返回最高那个**/@Testpublic  void test5(){List<Emp> empList=new ArrayList<>(3);empList.add(new Emp("张三",6500d,3));empList.add(new Emp("李斯特",7200d,1));empList.add(new Emp("李四",6000d,3));empList.add(new Emp("王五",7200d,3));//多个条件可以使用thenComparingXXX并列使用Optional<Emp> max = empList.stream().max(Comparator.comparingDouble(Emp::getSalary).thenComparingDouble(Emp::getLevel));System.out.println(max);}@Data@AllArgsConstructorclass  Emp{String name;Double salary;int level;}

map/flatMap

映射,可以将一个流的元素按照一定的映射规则映射到另一个流中。分为 map 和 flatMap:
map:接收一个函数作为参数,该函数会被应用到每个元素上,并将其映射成一个新的元素。

英文字符串数组的元素全部改为大写

    /*** 将字符串集合中的字符转换为大写字符*/@Testpublic  void test7(){List<String> list = Arrays.asList("aaa", "bbb", "rrer", "ewew", "sdsds");List<String> collect = list.stream().map(String::toUpperCase).collect(Collectors.toList());System.out.println(collect);}

flatMap将两个字符数组合并成一个新的字符数组

flatMap:接收一个函数作为参数,将流中的每个值都换成另一个流,然后把所有流连接成一个流。

    @Testpublic  void test8(){List<String> list = Arrays.asList("a,b,c,d", "1,2,3,4");List<String> listNew = list.stream().flatMap(s -> {// 将每个元素转换成一个streamString[] split = s.split(",");return Arrays.stream(split);}).collect(Collectors.toList());System.out.println(listNew);}

reduce

归约(reduce)
归约,也称缩减,顾名思义,是把一个流缩减成一个值,能实现对集合求和、求乘积和求最值操作。

reduce进行求和、求乘积的方式

    /*** reduce进行求和、求乘积的方式*/@Testpublic  void test9(){List<Integer> list = Arrays.asList(1, 3, 5, 7, 9, 15);// 求和方式1Optional<Integer> sum = list.stream().reduce((x, y) -> x + y);// 求和方式2Optional<Integer> sum2 = list.stream().reduce(Integer::sum);// 求和方式Integer sum3 = list.stream().reduce(0, Integer::sum);// 求乘积Optional<Integer> product = list.stream().reduce((x, y) -> x * y);// 求最大值方式1Optional<Integer> max = list.stream().reduce((x, y) -> x > y ? x : y);// 求最大值写法2Integer max2 = list.stream().reduce(1, Integer::max);}

统计(count/averaging)

Collectors 提供了一系列用于数据统计的静态方法:

计数:count
平均值:averagingInt、averagingLong、averagingDouble
最值:maxBy、minBy
求和:summingInt、summingLong、summingDouble
统计以上所有:summarizingInt、summarizingLong、summarizingDouble

    @Testpublic  void test10(){List<Emp> empList=new ArrayList<>(3);empList.add(new Emp("张三",6500d,3));empList.add(new Emp("李斯特",7200d,1));empList.add(new Emp("李四",6000d,3));empList.add(new Emp("王五",7200d,3));// 求总数long count1 = empList.stream().collect(Collectors.counting());//简写long count2 = empList.stream().count();// 求平均工资 Double average = empList.stream().collect(Collectors.averagingDouble(Emp::getSalary)); // 求最高工资 Optional<Double> max = empList.stream().map(Emp::getSalary).collect(Collectors.maxBy(Double::compare));// 求工资之和 Double sum1 = empList.stream().collect(Collectors.summingDouble(Emp::getSalary)); //简写Double sum2 = empList.stream().mapToDouble(Emp::getSalary).sum(); // 一次性统计所有信息DoubleSummaryStatistics collect = empList.stream().collect(Collectors.summarizingDouble(Emp::getSalary));}

分组(partitioningBy/groupingBy)

分区:将 stream 按条件分为两个 Map,比如员工按薪资是否高于 8000 分为两部分。

分组:将集合分为多个 Map,比如员工按性别分组。有单级分组和多级分组。

根据员工的level进行分组

    /*** 分组(partitioningBy/groupingBy)* 根据员工的level进行分组*/@Testpublic  void test11(){List<Emp> empList=new ArrayList<>(3);empList.add(new Emp("张三",6500d,3));empList.add(new Emp("李斯特",7200d,1));empList.add(new Emp("李四",6000d,1));empList.add(new Emp("王五",7200d,3));Map<Integer, List<Emp>> collect = empList.stream().collect(Collectors.groupingBy(Emp::getLevel));for (Map.Entry<Integer, List<Emp>> integerListEntry : collect.entrySet()) {System.out.println(integerListEntry);}}

接合(joining)

joining 可以将 stream 中的元素用特定的连接符(没有的话,则直接连接)连接成一个字符串。

将员工列表的姓名使用特定符号拼接成字符串

    /*** 接合(joining)* 将员工列表的姓名使用特定符号拼接成字符串*/@Testpublic  void test12(){List<Emp> empList=new ArrayList<>(3);empList.add(new Emp("张三",6500d,3));empList.add(new Emp("李斯特",7200d,1));empList.add(new Emp("李四",6000d,1));empList.add(new Emp("王五",7200d,3));String collect = empList.stream().map(p -> p.getName()).collect(Collectors.joining(","));System.out.println(collect);}

排序(sorted)

sorted,中间操作。有两种排序:

sorted():自然排序,流中元素需实现 Comparable 接口
sorted(Comparator com):Comparator 排序器自定义排序

根据工资倒序排列

    @Testpublic  void test12(){List<Emp> empList=new ArrayList<>(3);empList.add(new Emp("张三",6500d,3));empList.add(new Emp("李斯特",7300d,1));empList.add(new Emp("李四",6000d,1));empList.add(new Emp("王五",7200d,3));//根据工资倒序排列List<Emp> collect = empList.stream().sorted((o1, o2) -> {//逆序只需要Double.compare翻转顺序即可return Double.compare(o2.getSalary(), o1.getSalary());}).collect(Collectors.toList());System.out.println(collect);}

Stream实践总结相关推荐

  1. JDK8中Lambda深入理解和Stream实践

    1 lambda描述 Lambda 表达式是一种匿名函数,简单地说,它是没有声明的方法,也即没有访问修饰符.返回值声明和名字. 它可以写出更简洁.更灵活的代码.作为一种更紧凑的代码风格,使 Java ...

  2. 一文带你了解Java8之Stream

    Java8 Stream流式编程 简介 Java8中stream是用于对集合迭代器的增强,使之能供完成更高效的聚合操作(例如过滤.排序.统计分组等)或者大批量数据操作.此外,stream与lambda ...

  3. 2019年总结和展望

    属性 信息 文档名称 2019年总结和展望 版本号 V1.0.0.0 文档修改日志 修改时间 修改人 修改描述 版本号 2020-01-07 22:21 宋全恒 2019年总结和展望,确定基本结构,填 ...

  4. C/C++编程:标准库 - stdio.h 学习

    文章目录 get.fget.fgets 理论 实践 `puts.fputs` 理论 实践 feof ferror.clearerr 理论 实践 perror 理论 实践 `fprintf. snpri ...

  5. 5万字长文:Stream和Lambda表达式最佳实践-附PDF下载

    文章目录 1. Streams简介 1.1 创建Stream 1.2 Streams多线程 1.3 Stream的基本操作 Matching Filtering Mapping FlatMap Red ...

  6. 吃透JAVA的Stream流操作,多年实践总结

    在JAVA中,涉及到对数组.Collection等集合类中的元素进行操作的时候,通常会通过循环的方式进行逐个处理,或者使用Stream的方式进行处理. 例如,现在有这么一个需求: 从给定句子中返回单词 ...

  7. Stream入门到实践

    什么是Stream Stream是对集合对象的增强,专注于对集合对象进行各种便利的操作. Stream相关的接口与方法 java.util.stream包下新增Stream类 Collection接口 ...

  8. stream filter_Stream 流实践

    Stream 流 看之前:需要一些Lambda语法知识,可以查看参考资料中的文章:万字详解,JDK1.8的Lambda.Stream和日期的使用详解. 正文 Java8 API Stream 允许你以 ...

  9. bilibili Saber 实时计算平台架构与实践【Apache Flink 替换 Spark Stream的架构与实践】

    摘要:本文由 bilibili 大数据实时平台负责人郑志升分享,基于对 bilibili 实时计算的痛点分析,详细介绍了 bilibili Saber 实时计算平台架构与实践.本次分享主要围绕以下四个 ...

  10. Spring Cloud Stream Rabbit 3.1.3 入门实践

    Spring Cloud Stream是一个构建消息驱动的微服务应用框架,它使用Binder和消息中间件建立联系,我们在使用的时候不需要关心我们到底是使用的是RabbitMQ还是Kafka,因此我们可 ...

最新文章

  1. 阿里巴巴领导抱怨家里有矿的应届生不好带!聪明效率高,但从不加班,也不做职业规划!画饼谈心也没用,怎么办?...
  2. 《C#多线程编程实战(原书第2版)》——第3章 使用线程池 3.1 简介
  3. GitLab 8.3.3 发布 开源代码管理
  4. [ubuntu] chromium不断自己刷新问题
  5. 独自学习/组团学习,什么情境下采用效果更好?
  6. TailwindCSS v3.0 正式发布!一大波新特性来袭!
  7. python http get 请求_Python-Http请求库-Requests and AIOHTTP的使用
  8. Linux环境下Python的安装过程
  9. slf4j相关的配置信息
  10. nginx css 304 导致图片丢失_Nginx面试三连问:如何工作?负载均衡策略有哪些?如何限流?...
  11. 《机械原理》上 学后感
  12. 结构张量 matlab 图像,图像处理中 结构张量(structure tensor)
  13. 黑人抬棺html网站源码
  14. 计算机c盘扩容不用软件,电脑分区c盘扩容,这个方法超级简单!
  15. 云虚拟主机搭建个人博客
  16. 最新车载CarPlay盒子中方案内部配置参数
  17. 利用Python基础代码语句,实现2G时代文字小游戏,学会难道不香吗?
  18. Ubuntu18 网速显示 插件 显示在状态栏
  19. Python 任意进制 四进制 八进制 十六进制
  20. 清华大学霸榜计算机学科第一!2022 USNews世界大学排名出炉!

热门文章

  1. Android 4.1新特性
  2. Hulu机器学习问题与解答系列 | 二十九:WGANs:抓住低维的幽灵
  3. 关于java一些星号三角形的实现
  4. 微软的mak与kms区别
  5. “伊”心一意研技术,“伊”丝不苟做服务。Electropure EDI 成功参展第12届上海国际水展
  6. running_mean和running_var
  7. 麒麟 Linux 挂载大于2T的硬盘
  8. torch.cuda.amp.GradScaler(enabled=CFG.apex)是什么意思?
  9. 一个域名显示多个服务器ip,一个域名指向多个ip的方法
  10. SQL Server 2000 数据库安装与配置图文教程