java - 如何在Java流中处理时将一个列表分割为多个列表?

标签 java java-8

我有以下 API 调用

cloudwatchClient.deleteInsightRules(
    new DeleteInsightRulesRequest().withRuleNames(existingRuleNames));

失败是因为

 [exec] Exception in thread "main" com.amazonaws.services.cloudwatch.model.MissingRequiredParameterException: BATCH_REQUEST_TOO_LARGE: Batch size cannot exceed 20 items. (Service: AmazonCloudWatch; Status Code: 400; Error Code: MissingRequiredParameterException; Request ID: 0f820dc2-38b8-11e9-8465-3718764429f1)

现在我明白,我必须以 20 个为一组多次调用 cloudwatch 的 deleteInsight 规则。

所以从概念上讲,我正在寻找

existingRuleNames
   .stream().
   .chunkIntoSizeOf(20)          // This is an imaginary method, i need to convert it into something concrete
   .foreach(chunk -> cloudwatchClient.deleteInsightRules(
        new DeleteInsightRulesRequest().withRuleNames(chunk));

现在我在 java 8 流 api 中找不到任何允许我将列表划分和处理为 block 的内容。有点像 scala 分组功能 Split list into multiple lists with fixed number of elements

有人可以帮我解决这个问题吗?谢谢。我当然可以使用命令式风格并使用子列表,但如果可以的话我更愿意避免这种情况。

最佳答案

在下面的 forEach 中,您可以对 block 执行任何您想要执行的操作:

//my list of 30 strings that needs to be processed (existingRuleNames in your case):
List<String> list = IntStream.range(0, 30).mapToObj(String::valueOf).collect(Collectors.toList());

AtomicInteger prev = new AtomicInteger(0);
IntStream.range(1, (int) (20 * (Math.ceil(Math.abs(list.size() / 20.0)))))
        .filter(i -> i % 20 == 0 || i == list.size())
        .forEach(i -> {
            List<String> chunk = list.subList(prev.get(), i);
            System.out.println("Processing " + chunk);
            prev.set(i);
        });

输出:

Processing [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19]
Processing [20, 21, 22, 23, 24, 25, 26, 27, 28, 29]
<小时/>

所以你的代码应该类似于:

List<String> existingRuleNames = ...;

AtomicInteger prev = new AtomicInteger(0);
IntStream.range(1, (int) (20 * (Math.ceil(Math.abs(existingRuleNames.size() / 20.0)))))
        .filter(i -> i % 20 == 0 || i == existingRuleNames.size())
        .forEach(i -> {
            List<String> chunk = existingRuleNames.subList(prev.get(), i);
            cloudwatchClient.deleteInsightRules(
                    new DeleteInsightRulesRequest().withRuleNames(chunk));
            prev.set(i);
        });

关于java - 如何在Java流中处理时将一个列表分割为多个列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54859850/

相关文章:

java - 为什么 Stream.allMatch(在 Java 8 中)尝试计算所有表达式,即使可以在中途确定值?

java - ReadyStatement 和 LIKE 错误

java - Android 蓝牙搜索服务中可用设备

java - 从哪里获取 tools.jar 以用于 Java 8 jdk 早期版本

java - 在 Java 8 中迭代枚举

java - 以未知次数重复和连接已知字符串的更优雅方式

java - 提供静态内容时出错 Dropwziard

java - txt文件输入错误Java

java - 使用java流从数据库检索数据

java - 如何使用 Java 流求除数之和?