java - 在 Stream API 中跳过相同的组合
问题描述
我有一个 List 过滤列表 where 我在每个元素上流式传输并使用每个元素来设置一些项目
filteredList.parallelStream().forEach(s->{
ARChaic option=new ARChaic();
option.setCpu(s.getNoOfCPU());
option.setMem(s.getMemory());
option.setStorage(s.getStorage());
option.setOperatingSystem(s.getOperationSystem());
ARChaic newOption= providerDes.getLatest(option); //this is a external service
s.setCloudMemory(newOption.getMem());
s.setCloudCPU(newOption.getCpu());
s.setCloudStorage(newOption.getStorage());
s.setCloudOS(newOption.getOperatingSystem());
});
目标是调用此服务,但如果上述选项相同,则使用旧的调用。
例如 - 如果两台服务器具有相同的内存、CPU、操作系统和存储,那么它只会调用一次getLatest。
假设在过滤列表中的位置 1 和 7,我有相同的配置,那么我不应该在 7 处再次调用 getLatest,因为我已经有以前的选项值,我将其设置为 7(在服务调用后完成工作)
解决方案
您可以将equals
和添加hashcode
到您的Server
类中以表示两个 Server 实例何时相等。根据您的描述,您将不得不考虑并比较内存、cpu、操作系统和存储。
在此之后,您可以将 映射filteredList
为 aMap<Server, List<Server>>
以获取唯一服务器作为键,并且值将具有所有重复的服务器实例。您将为映射中的每个键调用一次服务,但在获得结果后,您可以使用结果更新作为映射值的所有服务器实例。
Map<Server, List<Server>> uniqueServers = filteredList.stream()
.collect(Collectors.groupingBy(Function.identity(), Collectors.mapping(Function.identity(),
Collectors.toList())));
uniqueServers.entrySet().parallelStream().forEach(entry -> {
Server currentServer = entry.getKey(); //Current server
ARChaic option=new ARChaic();
option.setCpu(currentServer.getNoOfCPU());
option.setMem(currentServer.getMemory());
option.setStorage(currentServer.getStorage());
option.setOperatingSystem(currentServer.getOperationSystem());
ARChaic newOption= providerDes.getLatest(option); //this is a external service
//update all servers with the result.
entry.getValue().forEach(server -> {
server.setCloudMemory(newOption.getMem());
server.setCloudCPU(newOption.getCpu());
server.setCloudStorage(newOption.getStorage());
server.setCloudOS(newOption.getOperatingSystem());
});
});
推荐阅读
- python - 如何将模型的实例传递给Django中的另一个模型?
- wheelnav.js - 如何将 Wheelnav.js 旋转方向始终设置为短距离?
- java - 如何使用 RestTemplate 传递标头?
- wordpress - 如何设置添加到购物车按钮以从表单字段中获取价格?
- javascript - node.js 列出所有活动线程
- azure-keyvault - 在 Azure 密钥保管库中存储密钥和机密
- javascript - 为什么回调永远不会在while循环中被调用/执行?
- python - 如何修复文本计算器中的错误?- Python
- sql - 通过查询获取组中的所有列
- java - Ajax POST 删除多个 Spring MVC 同名项目