网站首页 > java教程 正文
据 JetBrains发布的2021年开发者生态系统调查,Java 8 在java使用的版本中仍然是当前最流行的版本。72%的专业开发人员使用 Java 8 作为其在java开发中主要编程语言版本。
现在已经有不少文章介绍过java8的stream,你们可以搜索学习。但是存在一部分这种现象:了解api后,但是没有经常实践的地方,久而久之又生疏了。本文默认读者了解过java8的stream,提供一些使用小示例。高手多多提提意见。
本次示例实体
public class User {
private Integer userId;
private String username;
private String idCardNum;
private Integer age;
// ....省略了构造器、getter、setter
}
1、实体字段去重
1.1 对list中对象的某个字段去重,获取这个字段的集合
List<String> idCardNums = users.stream().map(User::getIdCardNum).distinct().collect(Collectors.toList());
当然,也可以利用set的天然特性进行去重
Set<String> idCardNums = users.stream().map(User::getIdCardNum).collect(Collectors.toSet());
其中,map方法是获取你需要的字段(map中还可以做很多操作,例如组装一个新实体等等,这里就不赘述了),distinct是去重操作。
1.2 对list中对象的某个字段去重,获取去重后对象的集合
List<User> distinctUsers = users.stream().collect(Collectors.collectingAndThen(Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing(User::getIdCardNum))), ArrayList::new));
2 分组
2.1 根据某个字段进行分组
Map<Integer, List<User>> groupUsers = users.stream().collect(Collectors.groupingBy(User::getUserId, Collectors.toList()));
有时仅根据数据的某个字段不能满足要求,要根据业务场景对字段进行处理。现在给出一种示例:
要求分组之后每个key都是定长:
Map<String, List<User>> groupUsers = users.stream().collect(Collectors.groupingBy(v->String.format("%02d", v.getUserId()), Collectors.toList()));
2.2 根据某个字段进行分组并提取对象中的某个字段
Map<Integer, List<String>> groupUsers = users.stream().collect(Collectors.groupingBy(User::getUserId, Collectors.mapping(User::getIdCardNum, Collectors.toList())));
其中,将最后的Collectors.toList()改成Collectors.toSet()可以进一步对对象字段idCardNum进行去重处理。
3 排序
3.1 按年龄排序(Integer类型)升序排序
List<User> ageUpSortUsers = users.stream().sorted(Comparator.comparing(User::getAge)).collect(Collectors.toList());
如果是JSONObject这类的就没法使用::进行方法调用,这里也给出示例
List<JSONObject> ageUpSortUserObjects = userObjects.stream().sorted(Comparator.comparingInt(i-> i.getIntValue("age"))).collect(Collectors.toList());
3.2 按年龄排序(Integer类型)降序排序(使用reversed()方法)
List<User> ageDownSortUsers = users.stream().sorted(Comparator.comparing(User::getAge).reversed()).collect(Collectors.toList());
降序时,对JSONObject进行排序时,因为要使用reversed方法,需要对i进行强转
List<JSONObject> ageDownSortUserObjects = userObjects.stream().sorted(Comparator.comparingInt(i-> ((JSONObject)i).getIntValue("age")).reversed()).collect(Collectors.toList());
3.3 使用年龄进行降序排序,年龄相同再使用userid升序排序
List<User> sortUsers = users.stream().sorted(Comparator.comparing(User::getAge).reversed().thenComparing(User::getUserId)).collect(Collectors.toList());
3.4 取前5或者top5
使用年龄进行降序排序,年龄相同再使用userid升序排序,最后取前五条数据。那这个就简单多了,一个limit解决。
List<User> sortUsers = users.stream().sorted(Comparator.comparing(User::getAge).reversed().thenComparing(User::getUserId))。limit(5).collect(Collectors.toList());
使用年龄进行降序排序,年龄相同再使用userid升序排序,最后取年龄最大的top5。这里的top5是指年龄相同的并列一个名次,依此获取top5,实际人数>=5。
List<Integer> ageTop5s = users.stream().map(User::getAge).distinct().sorted((v1, v2) -> v2 - v1).limit(5).collect(Collectors.toList());
List<User> top5Users = users.stream().filter(v -> ageTop5s.contains(v.getAge())).sorted(Comparator.comparing(User::getAge).reversed()).collect(Collectors.toList());
这里的解决方案是先获取排序依据字段的前五,再在原数据中过滤,最后排序。如果有好的方法,可以多提提,感谢。
先介绍这么多,下次再见。
[声明]:本文只有一张图片,源自JetBrains发布的调查,如有侵权,请联系我删除。
- 上一篇: Java 中的 Lambda 表达式深入解析:从语法糖到高阶函数
- 下一篇:已经是最后一篇了
猜你喜欢
- 2025-06-23 Java 中的 Lambda 表达式深入解析:从语法糖到高阶函数
- 2025-06-23 实战解析Android架构设计原则(android的架构)
- 2025-06-23 搭建mcp服务器用java17,可是项目开发用的是java8怎么实现?
- 2025-06-23 Java Stream:集合处理的api(java集合流操作)
- 2025-06-23 Java 8新特性全面剖析:让编程变得更简单优雅
- 2025-06-23 Java 8新特性全面解析与最佳实践:掌握未来编程的艺术
- 2025-06-23 Java 8日期时间API新特性揭秘与深度解析
- 2025-06-23 Java 8 Stream API 详解(java.stream)
你 发表评论:
欢迎- 最近发表
-
- java8的stream使用小示例(java stream的用法)
- Java 中的 Lambda 表达式深入解析:从语法糖到高阶函数
- 实战解析Android架构设计原则(android的架构)
- 搭建mcp服务器用java17,可是项目开发用的是java8怎么实现?
- Java Stream:集合处理的api(java集合流操作)
- Java 8新特性全面剖析:让编程变得更简单优雅
- Java 8新特性全面解析与最佳实践:掌握未来编程的艺术
- Java 8日期时间API新特性揭秘与深度解析
- Java 8 Stream API 详解(java.stream)
- Java机器学习库(Java ML)(二、聚类)
- 标签列表
-
- java反编译工具 (77)
- java反射 (57)
- java接口 (61)
- java随机数 (63)
- java7下载 (59)
- java数据结构 (61)
- java 三目运算符 (65)
- java对象转map (63)
- Java继承 (69)
- java字符串替换 (60)
- 快速排序java (59)
- java并发编程 (58)
- java api文档 (60)
- centos安装java (57)
- java调用webservice接口 (61)
- java深拷贝 (61)
- 工厂模式java (59)
- java代理模式 (59)
- java.lang (57)
- java连接mysql数据库 (67)
- java重载 (68)
- java 循环语句 (66)
- java反序列化 (58)
- java时间函数 (60)
- java是值传递还是引用传递 (62)
本文暂时没有评论,来添加一个吧(●'◡'●)