2017-08-14 30 views
1

我一直在试图解决这个一段时间,但我的Java 8技能需要一些工作。的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

你不应该试图要解决运行时异常就像一个IndexOutOfBounds。这是一个错误。只需修复该错误。尝试访问列表界限之外的索引是没有意义的。所以不要这样做。 –

+1

正如@JBNizet所说的,你不应该试图解决'IndexOutOfBoundsException'而是解决错误。然而,仅仅为了记录,你可以用** try-catch **:'try {抛出异常的代码} catch(IndexOutOfBoundsException e){如果发生的话执行的代码}'执行。 – Zabuza

+0

我不是想解决这个错误。我会很高兴,如果它实际上抛出错误 – SpaceCowboy

回答

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是在边界调用的someMethod的nn+1。你需要让你想怎么处理它在列表中的最后一个元素,虽然

+0

这是与OP相同的代码。 –

+0

您是否可以突出显示这些更改并解释他们为什么解决问题? – Zabuza

+0

@JBNizet,哎呀抱歉,修正 – Parker

0

令说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); 
} 
+0

这应该工作,虽然我还没有读取最后一个值。正如我所说,它按以下顺序读取列表:索引(0) - 索引(1),索引(1) - 索引(2).....索引(10) - 索引(11 - 没有索引11) – SpaceCowboy

+0

我改进了我的答案。现在你可以复制和粘贴。 –

0

第二范围内()函数是唯一的,这意味着,如果你将其设置为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))); 
}