我们可以跳过 Java8 个流吗

Can we skip in Java8 Streams

我有一个遍历 employeeId 列表的 for 循环。在每次迭代中,它都会调用一个服务来查看它是否有任何值,如果我们得到某个 id 的任何值,那么我们需要跳过所有剩余的迭代。我已经通过使用传统的 for 循环来做到这一点,如下面的 shopn

for(int i=0; i<employeeIdLists.length; i++) {
    userDetails = someService.getUserId(employeeIdLists.get(i));
    if(userDetails != null) {
        i = employeeIdLists.length; // skip rest of the iteration
    }
}

我想知道我是否可以使用 Java Streams 进行类似的操作。我尝试了一些,但这不符合预期

employeeIdLists.stream()
.map(id -> someService.getUserId(id))
.filter(userDetails -> userDetails!=null)
.collect(Collectors.toList());

是的,您可以使用 findAny()findFirst() 执行此操作,这将在第一次找到值时停止管道(在过滤器之后,在您的情况下):

userDetails = employeeIdLists.streams()
    .map(id -> someService.getUserId(id))
    .filter(userDetails -> userDetails!=null)
    .findAny()
    .orElse(null); //null if all values were null

在此管道中,userDetails 将设置为未从服务获得空结果的值,一旦找到该值,管道将立即停止。