Как перейти к следующему значению в цикле при использовании Java 8 Stream API - PullRequest
0 голосов
/ 05 июня 2018

При использовании внешней итерации над java collectios мы используем ключевое слово «continue» для перехода к следующему значению в цикле.Как быть в случае, когда мы используем API Java потока?Пример:

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 голосов
/ 05 июня 2018

Java stream api используется только для работы с этим конкретным потоком элементов.Вы никогда не сможете использовать его для управляющих операторов, таких как 'break' или 'continue', для управления внешними циклами (как здесь вы хотите управлять циклом 'Item').

0 голосов
/ 05 июня 2018

Может быть, вы просто хотите:

for (Item item : item){
    if (users.stream().anyMatch(u -> u.getName().equals("Tom"))) {
        continue;
    }

    // more code here...
}
0 голосов
/ 05 июня 2018

Stream-API не предоставляет механизм итерации, как Итератор , для этого вы должны использовать 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.Используйте метод anyMatch(Predicate<? super T> predicate), который возвращает true, если какой-либо элемент потока соответствует предикату.Он принимает тот же предикат, что и filter(Predicate<? super T> predicate).

if (users.stream().anyMatch(user -> user.getName().equals("Tom"))) {
    for (Item item : item) {
        // ...
    }
}

Edit2: Как правильно заметил @Bohemian, рассмотрите возможность проверки наличия элемента в каждой итерации, так как может бытьэлемент с добавленным "Tom" и условие больше не сохраняется false.

...