我遇到了这样的情况,我需要知道列表中一个元素的索引(位置),但只有一个谓词表达式来识别该元素。我查找了类似于 Stream 的函数
int index = list.stream().indexOf(e -> "TESTNAME".equals(e.getName()));
但是没有用。当然,我可以这样写:
int index = list.indexOf(list.stream().filter(e -> "TESTNAME".equals(e.getName()))
.findFirst().get());
但是这种方法会 a)在最坏情况下(元素是最后一个)遍历列表两次,b)如果没有元素与谓词匹配,则会失败(我宁愿使用 -1索引)。
我编写了一个实用程序方法来实现此功能:
public static <T> int indexOf(List<T> list, Predicate<? super T> predicate) {
int idx = 0;
for (Iterator<T> iter = list.iterator(); iter.hasNext(); idx++) {
if (predicate.test(iter.next())) {
return idx;
}
}
return -1;
}
但是,由于这似乎是一个非常琐碎的算法,我本来期望在Java 8 Stream API中能找到它。我是错过了吗?还是真的没有这样的功能?(奖励问题:如果没有这样的方法,是否有很好的理由?在函数式编程中使用索引可能是一种反模式吗?)
takeWhile()
会,不是吗?这是我的错... - Florian AlbrechtStream#count
中减去结果,使用Stream#dropWhile
将起作用,但不幸的是,您只能使用Java 8。 - Jacob G.