Stream实践总结
文章目录
- 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实践总结相关推荐
- JDK8中Lambda深入理解和Stream实践
1 lambda描述 Lambda 表达式是一种匿名函数,简单地说,它是没有声明的方法,也即没有访问修饰符.返回值声明和名字. 它可以写出更简洁.更灵活的代码.作为一种更紧凑的代码风格,使 Java ...
- 一文带你了解Java8之Stream
Java8 Stream流式编程 简介 Java8中stream是用于对集合迭代器的增强,使之能供完成更高效的聚合操作(例如过滤.排序.统计分组等)或者大批量数据操作.此外,stream与lambda ...
- 2019年总结和展望
属性 信息 文档名称 2019年总结和展望 版本号 V1.0.0.0 文档修改日志 修改时间 修改人 修改描述 版本号 2020-01-07 22:21 宋全恒 2019年总结和展望,确定基本结构,填 ...
- C/C++编程:标准库 - stdio.h 学习
文章目录 get.fget.fgets 理论 实践 `puts.fputs` 理论 实践 feof ferror.clearerr 理论 实践 perror 理论 实践 `fprintf. snpri ...
- 5万字长文:Stream和Lambda表达式最佳实践-附PDF下载
文章目录 1. Streams简介 1.1 创建Stream 1.2 Streams多线程 1.3 Stream的基本操作 Matching Filtering Mapping FlatMap Red ...
- 吃透JAVA的Stream流操作,多年实践总结
在JAVA中,涉及到对数组.Collection等集合类中的元素进行操作的时候,通常会通过循环的方式进行逐个处理,或者使用Stream的方式进行处理. 例如,现在有这么一个需求: 从给定句子中返回单词 ...
- Stream入门到实践
什么是Stream Stream是对集合对象的增强,专注于对集合对象进行各种便利的操作. Stream相关的接口与方法 java.util.stream包下新增Stream类 Collection接口 ...
- stream filter_Stream 流实践
Stream 流 看之前:需要一些Lambda语法知识,可以查看参考资料中的文章:万字详解,JDK1.8的Lambda.Stream和日期的使用详解. 正文 Java8 API Stream 允许你以 ...
- bilibili Saber 实时计算平台架构与实践【Apache Flink 替换 Spark Stream的架构与实践】
摘要:本文由 bilibili 大数据实时平台负责人郑志升分享,基于对 bilibili 实时计算的痛点分析,详细介绍了 bilibili Saber 实时计算平台架构与实践.本次分享主要围绕以下四个 ...
- Spring Cloud Stream Rabbit 3.1.3 入门实践
Spring Cloud Stream是一个构建消息驱动的微服务应用框架,它使用Binder和消息中间件建立联系,我们在使用的时候不需要关心我们到底是使用的是RabbitMQ还是Kafka,因此我们可 ...
最新文章
- 阿里巴巴领导抱怨家里有矿的应届生不好带!聪明效率高,但从不加班,也不做职业规划!画饼谈心也没用,怎么办?...
- 《C#多线程编程实战(原书第2版)》——第3章 使用线程池 3.1 简介
- GitLab 8.3.3 发布 开源代码管理
- [ubuntu] chromium不断自己刷新问题
- 独自学习/组团学习,什么情境下采用效果更好?
- TailwindCSS v3.0 正式发布!一大波新特性来袭!
- python http get 请求_Python-Http请求库-Requests and AIOHTTP的使用
- Linux环境下Python的安装过程
- slf4j相关的配置信息
- nginx css 304 导致图片丢失_Nginx面试三连问:如何工作?负载均衡策略有哪些?如何限流?...
- 《机械原理》上 学后感
- 结构张量 matlab 图像,图像处理中 结构张量(structure tensor)
- 黑人抬棺html网站源码
- 计算机c盘扩容不用软件,电脑分区c盘扩容,这个方法超级简单!
- 云虚拟主机搭建个人博客
- 最新车载CarPlay盒子中方案内部配置参数
- 利用Python基础代码语句,实现2G时代文字小游戏,学会难道不香吗?
- Ubuntu18 网速显示 插件 显示在状态栏
- Python 任意进制 四进制 八进制 十六进制
- 清华大学霸榜计算机学科第一!2022 USNews世界大学排名出炉!
热门文章
- Android 4.1新特性
- Hulu机器学习问题与解答系列 | 二十九:WGANs:抓住低维的幽灵
- 关于java一些星号三角形的实现
- 微软的mak与kms区别
- “伊”心一意研技术,“伊”丝不苟做服务。Electropure EDI 成功参展第12届上海国际水展
- running_mean和running_var
- 麒麟 Linux 挂载大于2T的硬盘
- torch.cuda.amp.GradScaler(enabled=CFG.apex)是什么意思?
- 一个域名显示多个服务器ip,一个域名指向多个ip的方法
- SQL Server 2000 数据库安装与配置图文教程