如何使用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
相关产品推荐
相关产品推荐

