You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用IntStream和mapToObj迭代两个嵌套列表校验同索引内层列表长度

错误原因

你遇到的编译报错是因为mapToObj要求传入的转换函数必须有返回值,而你当前定义的validate方法返回类型是void,没有返回值可以封装为流的元素,因此触发了泛型类型匹配失败的提示。

调整方案

首先你需要先校验两个外层列表的长度是否一致,否则会出现索引越界的问题,再按索引逐一校验对应位置的内层列表长度,两种符合要求的实现如下:

实现1:调整validate返回布尔值,搭配filter实现

首先修改validate方法返回值:

// 校验对应索引的两个内层列表长度是否一致,返回校验结果
public boolean validate(int index, List<String> firstList, List<Integer> secondList) {
    return firstList.size() == secondList.size();
}

完整校验逻辑:

List<List<String>> a = config.getStrips();
List<List<Integer>> b = slotMachineConfig.getWeights();

// 先校验外层列表长度一致
if (a.size() != b.size()) {
    throw new SlotMachineInvalidConfigException();
}

IntStream.range(0, a.size())
    .filter(i -> !validate(i, a.get(i), b.get(i)))
    .findFirst()
    // 只要存在任意一个索引位置校验不通过就抛出异常
    .ifPresent(i -> {throw new SlotMachineInvalidConfigException();});

实现2:严格使用mapToObj要求的写法

如果明确要求必须搭配mapToObj使用,可以调整validate方法返回校验不通过的索引,校验通过返回null:

public Integer validate(int index, List<String> firstList, List<Integer> secondList) {
    return firstList.size() == secondList.size() ? null : index;
}

对应流逻辑:

List<List<String>> a = config.getStrips();
List<List<Integer>> b = slotMachineConfig.getWeights();

if (a.size() != b.size()) {
    throw new SlotMachineInvalidConfigException();
}

IntStream.range(0, a.size())
    .mapToObj(i -> validate(i, a.get(i), b.get(i)))
    .filter(Objects::nonNull)
    .findFirst()
    .ifPresent(i -> {throw new SlotMachineInvalidConfigException();});

补充说明

你之前的旧实现逻辑和需求不符:旧代码是拿a的每一个内层列表和b的所有内层列表对比长度,不是按索引对应位置对比,新的按索引遍历的实现才能满足你的需求。


内容的提问来源于stack exchange,提问作者Maria1995

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 10:57:03