Java 8 过滤器谓词参数索引越界

Java 8 Filter Predicate Parameter Index Out Of Bounds

我已经尝试解决这个问题一段时间了,但我的 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?

中是预期的

我怎么能说“如果我们得到一个索引越界 return 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 是否在为 nn+1 调用 someMethod 的范围内。不过,您需要为列表中的最后一个元素创建另一种方法来处理它

假设 someList.size() = 10,所以最后一个元素的索引为 9。然后你做类似 n+1 的事情,即 someList.get(9+1) 然后异常发生。应该是 someList.size() - 1

return IntStream.range(0, someList.size()-1) .filter(n -> someMethod(someList.get(n), someList.get(n + 1))) .collect(Collectors.toList());

它应该可以工作。

编辑:您需要做一些检查

`   private void invoke() {

    List<String> someList = Arrays.asList("Test", "Super");
    int size = someList.size();

    List<Integer> collect = IntStream.range(0, size)
            .filter(n -> someMethod(someList.get(n), getNext(someList, n + 1)))
            .mapToObj(i -> i)
            .collect(Collectors.toList());

}

public <T> T getNext(List<T> someList, int index) {
    return someList.size() > index ? someList.get(index) : null;
}


public boolean someMethod(String a1, String a2) {
    return a1.equals(a2);
}

range() 函数中的第二个参数是独占的,这意味着如果您将它设置为 20,您的范围将一直到 19(不包括 20),在您的情况下,您希望获得最后一个之前的索引,因此如果最后一个索引是 size-1 你应该传递给函数 size() 如果你想得到 size-2 你应该传递最后一个参数 size-1 这里是一个简单的例子

public static void main(String[] args) {
    List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);
    IntStream.range(0, list.size() - 1).forEach(index -> System.out.println("Me " + list.get(index) + " and my brother " + list.get(index + 1)));
}