一段时间以来,我一直在努力解决这个问题,但我的 Java 8 技能需要一些努力。
我遇到的这个问题是在 IntStream
中。我正在使用一个过滤器来调用一个谓词,该谓词将对列表中的当前项目和下一个项目运行一些逻辑。
return IntStream.range(0, someList.size() - 1)
.filter(n -> someMethod(someList.get(n), someList.get(n + 1)))
.mapToObj(i -> ((Integer) i).toString())
.collect(Collectors.joining(", "));
问题是没有检查最后一项。
假设我在列表中有 10 个项目,第一次迭代将查看项目 0 和 1,然后是 1 和 2 等等,直到我们到达 10 和 IndexOutOfBounds
。
这里没有抛出错误,这很奇怪,但可能在 Java 8 中是预期的?
我怎么能说“如果索引越界就返回 true”?
我希望这是有道理的。干杯
最佳答案
您正在尝试从 0
迭代到 size+1
,因此对于大小为 3 的列表,您正在尝试:
list[0]
- 有效
list[1]
- 有效
list[2]
- 有效
list[3]
- OOB,因为列表的大小只有 3
将其更改为:
return IntStream.range(0, someList.size())
.filter(n -> n < someList.size()-1 ? someMethod(someList.get(n), someList.get(n+1)) : someOtherMethod(someList.get(n)).collect(Collectors.toList));
这将解决两件事。第一,它会修复你在 range()
中的 OOB,第二,它会检查 n
是否在为 n
调用 someMethod 的范围内> 和 n+1
。不过,您需要为列表中的最后一个元素创建另一种方法来处理它
关于Java 8 过滤器谓词参数索引越界,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45676266/