【java8 Stream日常学习使用】
2022/6/1 1:22:22
本文主要是介绍【java8 Stream日常学习使用】,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
Stream学习 ——2022.05.31
简介
Java 8 是一个非常成功的版本,这个版本新增的Stream,配合同版本出现的Lambda ,给我们操作集合(Collection)提供了极大的便利。Stream流是JDK8新增的成员,允许以声明性方式处理数据集合,可以把Stream流看作是遍历数据集合的一个高级迭代器。Stream 是 Java8 中处理集合的关键抽象概念,,可以执行非常复杂的查找/筛选/过滤、排序、聚合和映射数据等操作。使用Stream API 对集合数据进行操作,就类似于使用 SQL 执行的数据库查询。也可以使用 Stream API 来并行执行操作。简而言之,Stream API 提供了一种高效且易于使用的处理数据的方式。
但是要注意,虽然Stream api某种意义上可以代替sql,但是并不建议完全代替,因为当数据量过大或者访问压力 大的时候还是需要数据库这种专业的数据处理引擎去处理,stream api 只是让代码更简洁好看,所以我的建议是,对于操作数据量不大的集合需求可以用stream一试。
至于 lambda 表达式,也是代码简洁化的一种,可以和stream 一起学习:
常见的使用
最常用创建的方式:通过 java.util.Collection.stream() 方法用集合创建流
测试用例:
Collectors.groupingBy 分组
- 根据单个字段分组:
Map<String, List<Capcom>> collectMap = capList.stream().collect(Collectors.groupingBy(Capcom::getVersion));
PS:// Capcom::getVersion 即 capcom -> capcom.getVersion(),::也叫方法引用
- 根据多个字段分组,注意,这里写了个dto来存放分组字段
当然,不借助实体类直接拼接字段也可以:
排序stream().sorted()
- 根据字段排序 stream().sorted(),下面列出三种情况:
/** * 按照score进行排序 * 1. 自定义升序 * 2. 自定义降序 * 3.多字段升序,score 升序,若相同则根据 c_num 继续判断 */ List<Capcom> ascOrder = new ArrayList(); List<Capcom> descOrder = new ArrayList(); List<Capcom> multOrder = new ArrayList(); ascOrder = capList.stream().sorted(Comparator.comparing(Capcom::getScore)).collect(Collectors.toList()); descOrder = capList.stream().sorted(Comparator.comparing(Capcom::getScore).reversed()).collect(Collectors.toList()); multOrder = capList.stream().sorted(Comparator.comparing(Capcom::getScore).thenComparing(Capcom::getcNum)).collect(Collectors.toList());
MIN 和 MAX
// min 和 max,以max为例 List<Integer> list = Arrays.asList(3, 45, 675, 2, 5); Optional<Integer> max = list.stream().max(Integer::compareTo); // 自定义排序 Optional<Integer> max2 = list.stream().max(new Comparator<Integer>() { @Override public int compare(Integer o1, Integer o2) { return o1.compareTo(o2); } }); System.out.println(max2); //输出: Optional[675]
filter 筛选
条件筛选过滤;
reduce 规约
规约,可将流缩减为一个值
// reduce 规约,可将流缩减为一个值 Optional<Long> reSum = capList.stream().map(Capcom::getCapId).reduce(Long::sum); Optional<Long> reMax = capList.stream().map(Capcom::getCapId).reduce(Long::max); Optional<BigDecimal> decimalSum = capList.stream().map(Capcom::getScore).reduce(BigDecimal::add); Optional<BigDecimal> decimalMax = capList.stream().map(Capcom::getScore).reduce(BigDecimal::max); System.out.println(" long sum: "+reSum + " long max :" + reMax + " decimal sum :" + decimalSum +" decimal max :" + decimalMax); // 输出:long sum: Optional[7028] long max :Optional[1007] decimal sum :Optional[600] decimal max :Optional[90]
toSet 和 toMap
数据汇总为Set或者Map;
// toSet, toMap Set<String> numberSet = capList.stream().map(Capcom::getcNum).collect(Collectors.toSet()); Map<String, Capcom> mapCollect = capList.stream().filter(x -> x.getCapId() < 1003).collect(Collectors.toMap(Capcom::getcNum, y -> y)); System.out.println("编号合集 num Set:" +numberSet + "mapCollect :" + mapCollect); /** * 输出: * 编号合集 num Set:[0007, 0004, 0005, 0002, 0003, 0000, 0001] * mapCollect :{0002=Capcom{capId=1002, cName='卡洛斯·奥利维拉', cNum='0002', version='1', score=83}, * 0001=Capcom{capId=1001, cName='吉尔.瓦伦蒂安', cNum='0001', version='1', score=87}} */
这篇关于【java8 Stream日常学习使用】的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-05-01为什么公共事业机构会偏爱 TiDB :TiDB 数据库在某省妇幼健康管理系统的应用
- 2024-04-26敏捷开发:想要快速交付就必须舍弃产品质量?
- 2024-04-26静态代码分析的这些好处,我竟然都不知道?
- 2024-04-26你在测试金字塔的哪一层?(下)
- 2024-04-26快刀斩乱麻,DevOps让代码评审也自动起来
- 2024-04-262024年最好用的10款ER图神器!
- 2024-04-2203-为啥大模型LLM还没能完全替代你?
- 2024-04-2101-大语言模型发展
- 2024-04-17基于SpringWeb MultipartFile文件上传、下载功能
- 2024-04-14个人开发者,Spring Boot 项目如何部署