当对java集合使用外部迭代时,我们使用关键字“continue”来移动到循环中的下一个值。在这种情况下,当我们使用java流API时呢?例如:
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...
}
没有流:
for(Item item : item){
for(User user : users){
if(user.getName("Tom") exist = true;
}
if (exist) continue;
more code here...
}
答案 0 :(得分:2)
Stream-API不提供像Iterator那样的迭代机制,为此您必须使用Iterator<User>
。但是,最好先过滤正确的值。
List<User> filteredUsers = users.stream()
.filter(user -> user.getName().equals("Tom"))
.collect(Collectors.toList());
现在获得Iterator<User>
并迭代。
Iterator<User> iterator = filteredUsers.iterator();
while (iterator.hasNext()) {
User user = iterator.next()
// Take a control over the further iteration here...
}
修改:
根据您的编辑,您想知道任何用户是否有名称Tom
,然后执行items
上的迭代。如果流的任何元素与谓词匹配,请使用返回true
的{{3}}方法。它接受与anyMatch(Predicate<? super T> predicate)
相同的谓词。
if (users.stream().anyMatch(user -> user.getName().equals("Tom"))) {
for (Item item : item) {
// ...
}
}
Edit2:正如@Bohemian已经正确注意到的那样,考虑每次迭代检查元素是否存在,因为可能有一个元素添加了"Tom"
且条件不再保持false
。
答案 1 :(得分:2)
Java stream api仅用于处理特定的元素流。你永远不能将它用于控制语句,比如'break'或'continue'来控制外部循环(就像你想要控制'Item'循环一样)。
&#xA;答案 2 :(得分:2)
也许你只想要:
for (Item item : item){
if (users.stream().anyMatch(u -> u.getName().equals("Tom"))) {
continue;
}
// more code here...
}