百度360必应搜狗淘宝本站头条
当前位置:网站首页 > IT知识 > 正文

java8的stream使用小示例

liuian 2025-01-09 14:25 17 浏览

据 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发布的调查,如有侵权,请联系我删除。

相关推荐

vue怎么和后端php配合

Vue和后端PHP可以通过HTTP请求进行配合。首先,前端Vue可以使用axios库或者Vue自带的$http对象来发送HTTP请求到后端PHP接口。通过axios库发送POST、GET、PUT等请求...

Ansible最佳实践之 AWX 使用 Ansible 与 API 通信

#头条创作挑战赛#API简单介绍红帽AWX提供了一个类似Swagger的RESTful风格的Web服务框架,可以和awx直接交互。使管理员和开发人员能够在webUI之外控制其...

PHP8.3 错误处理革命:Exception 与 Error 全面升级

亲爱的小伙伴,好久没有发布信息了,最近学习了一下PHP8.3的升级,都有哪些优化和提升,把学到的分享出来给需要的小伙伴充下电。技术段位:高可用性必修目标收益:精准错误定位+异常链路追踪适配场景...

使用 mix/vega + mix/db 进行现代化的原生 PHP 开发

最近几年在javascript、golang生态中游走,发现很多npm、gomod的优点。最近回过头开发MixPHPV3,发现composer其实一直都是一个非常优秀的工具,但是...

15 个非常好用的 JSON 工具

JSON(JavaScriptObjectNotation)是一种流行的数据交换格式,已经成为许多应用程序中常用的标准。无论您是开发Web应用程序,构建API,还是处理数据,使用JSON工具可以大...

php8环境原生实现rpc

大数据分布式架构盛行时代的程序员面试,常常遇到分布式架构,RPC,本文的主角是RPC,英文名为RemoteProcedureCall,翻译过来为“远程过程调用”。主流的平台中都支持各种远程调用技术...

「PHP编程」如何搭建私有Composer包仓库?

在前一篇文章「PHP编程」如何制作自己的Composer包?中,我们已经介绍了如何制作自己的composer包,以及如何使用composer安装自己制作的composer包。不过,这其中有...

WAF-Bypass之SQL注入绕过思路总结

过WAF(针对云WAF)寻找真实IP(源站)绕过如果流量都没有经过WAF,WAF当然无法拦截攻击请求。当前多数云WAF架构,例如百度云加速、阿里云盾等,通过更改DNS解析,把流量引入WAF集群,流量经...

【推荐】一款 IDEA 必备的 JSON 处理工具插件 — Json Assistant

JsonAssistant是基于IntelliJIDEs的JSON工具插件,让JSON处理变得更轻松!主要功能完全支持JSON5JSON窗口(多选项卡)选项卡更名移动至主编辑器用...

技术分享 | 利用PHAR协议进行PHP反序列化攻击

PHAR(“PhpARchive”)是PHP中的打包文件,相当于Java中的JAR文件,在php5.3或者更高的版本中默认开启。PHAR文件缺省状态是只读的,当我们要创建一个Phar文件需要修改...

php进阶到架构之swoole系列教程(一)windows安装swoole

目录概述安装Cygwin安装swoolephp7进阶到架构师相关阅读概述这是关于php进阶到架构之swoole系列学习课程:第一节:windows安装swoole学习目标:在Windows环境将搭建s...

go 和 php 性能如何进行对比?

PHP性能很差吗?每次讲到PHP和其他语言间的性能对比,似乎都会发现这样一个声音:单纯的性能对比没有意义,主要瓶颈首先是数据库,其次是业务代码等等。好像PHP的性能真的不能单独拿出来讨论似的。但其实一...

Linux(CentOS )手动搭建LNMP(Linux+Nginx+Mysql+PHP)坏境

CentOS搭建LNMP(Linux+Nginx+Mysql+PHP)坏境由于网上各种版本新旧不一,而且Linux版本也不尽相同,所以自己写一遍根据官网的提示自己手动搭建过程。看官方文档很重要,永远...

json和jsonp区别

JSON和JSONP虽然只有一个字母的差别,但其实他们根本不是一回事儿:JSON是一种数据交换格式,而JSONP是一种非官方跨域数据交互协议。一个是描述信息的格式,一个是信息传递的约定方法。一、...

web后端正确的返回JSON

在web开发中,前端和后端发生数据交换传输现在最常见的形式就是异步ajax交互,一般返回给js都是json,如何才是正确的返回呢?前端代码想要获取JSON数据代码如下:$.get('/user-inf...