使用Java8流API时如何移动到循环中的下一个值
在java集合上使用外部迭代时,我们使用关键字“continue”移动到循环中的下一个值。在这种情况下,当我们使用java流API时会怎么样?例如:使用Java8流API时如何移动到循环中的下一个值,java,loops,java-8,iteration,java-stream,Java,Loops,Java 8,Iteration,Java Stream,在java集合上使用外部迭代时,我们使用关键字“continue”移动到循环中的下一个值。在这种情况下,当我们使用java流API时会怎么样?例如: List<User> users; for(Item item : item){ users.stream() .filter(user -> user.getName().equals("Tom")) .findFirst() .ifPresent(move to the
List<User> users;
for(Item item : item){
users.stream()
.filter(user -> user.getName().equals("Tom"))
.findFirst()
.ifPresent(move to the next value in a outer loop(items) ???? like **continue**;);
more code here...
}
流API不像提供的那样提供迭代机制,为此您必须使用
迭代器。但是,最好先过滤正确的值
List<User> filteredUsers = users.stream()
.filter(user -> user.getName().equals("Tom"))
.collect(Collectors.toList());
< > > Ed2:正如薄赫绵所正确指出的,考虑每次迭代中检查元素的存在,因为可能有一个元素,它包含了<代码>“Tom”< /C> >,并且条件不再是“代码> false ”。 < P> java流API仅用于处理特定元素流。您永远不能将其用于控制语句,如“break”或“continue”,以控制外部循环(如此处您希望控制“Item”循环)。也许您只需要:
for (Item item : item){
if (users.stream().anyMatch(u -> u.getName().equals("Tom"))) {
continue;
}
// more code here...
}
你到底想做什么?找到任何匹配项后要执行的操作?findFirst()
只返回单个元素(如果存在)。如果要迭代所有元素,请使用forEach()
。如果user.getName().equals(“Tom”),则我要跳过一个iteration,然后移动到下一个item,因此要获取Tom
之后的下一个条目?仍然不清楚。。。演示在没有流的情况下如何操作。我将首先评估条件,然后进入循环。@Nikolas除了“这里有更多代码”可能会将Tom添加到用户中。@Boheamian:一个很好的观点!:))+1.这取决于“这里有更多的代码”真的有。
Iterator<User> iterator = filteredUsers.iterator();
while (iterator.hasNext()) {
User user = iterator.next()
// Take a control over the further iteration here...
}
if (users.stream().anyMatch(user -> user.getName().equals("Tom"))) {
for (Item item : item) {
// ...
}
}
for (Item item : item){
if (users.stream().anyMatch(u -> u.getName().equals("Tom"))) {
continue;
}
// more code here...
}