使用Java 8 Stream API

时间:2018-06-05 13:31:53

标签: java java-8 stream 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 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...
}

3 个答案:

答案 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...
}