продолжить не работает при использовании потоков и карты - PullRequest
3 голосов
/ 06 февраля 2020

У меня есть этот простой код, где я использую поток и функцию .map (). Я делаю нулевую проверку для идентификатора, и внутри него добавляется continue Продолжение выдает мне ошибку: Продолжить вне l oop Когда я удалить продолжение Я не получаю сообщение об ошибке, но не знаю, является ли поведение таким же?

public List<Long> getIds(final Long[][] value){
     List<Long> list = Arrays.stream(value).map(result ->{
                final Long id = result[1];
                if(id == null){
                    continue; // This part doesn't work (error: Continue outside of loop)
                }
                return id;
            }).collect(Collectors.toList());
}

Есть какие-либо предположения о том, почему это происходит с .streams? Принимая во внимание, что когда я не использую поток, я могу использовать continue .

Вопрос был помечен как дубликат, но это не так. Использование return наверняка работает в forEach, где не требуется тип возврата, но не в map.

1 Ответ

7 голосов
/ 06 февраля 2020

continue работает в течение l oop. Вы можете использовать flatMap в качестве обходного пути:

 List<Long> list = Arrays.stream(value).flatMap(result ->{
            final Long id = result[1];
            return Stream.ofNullable(id);
        }).collect(Collectors.toList());

Вы также можете сделать его более кратким, используя Stream.ofNullable напрямую, как подсказывает @Naman:

 List<Long> list = Arrays.stream(value)
    .flatMap(result -> Stream.ofNullable(result[1]))
    .collect(Collectors.toList());

Другой, более элегантной версией моего впервые предложенного метода @Holger было бы использование предиката в filter:

 List<Long> list = Arrays.stream(value)
    .map(result -> result[1])
    .filter(Objects::nonNull)
    .collect(Collectors.toList());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...