Java 8过滤器谓词参数索引超出界限

时间:2017-08-14 13:58:42

标签: java java-8 java-stream predicate

我一直试图解决这个问题,但我的 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 ”?

我希望这是有道理的。干杯

3 个答案:

答案 0 :(得分:3)

您正试图从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的界限。您需要为列表中最后一个元素处理它的方法制作另一种方法,但

答案 1 :(得分:0)

假设someList.size()= 10,所以最后一个元素是索引9.然后你做了类似n + 1的事情,这是someList.get(9 + 1)然后发生Exception。它应该是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);
}

答案 2 :(得分:0)

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)));
}