我一直试图解决这个问题,但我的 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 :(得分: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
是否在为n
和n+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)));
}