我们可以跳过 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
将设置为未从服务获得空结果的值,一旦找到该值,管道将立即停止。
我有一个遍历 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
将设置为未从服务获得空结果的值,一旦找到该值,管道将立即停止。