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
是否在为 n
和 n+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)));
}
我已经尝试解决这个问题一段时间了,但我的 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
是否在为 n
和 n+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)));
}