首页 > 解决方案 > 在 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(在服务调用后完成工作)

标签: javajava-stream

解决方案


您可以将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());
        });
    });

推荐阅读