Как мы обрабатываем исключения в потоках Java - PullRequest
4 голосов
/ 04 октября 2019

Как я могу преобразовать это для цикла с использованием потока.

for (final Foo foo : fooList) {
    if (!FooConstant.FOO_TYPE.equals(foo.getType())) {
        throw new BadRequestException(
          LOGGER,
          FooErrorEnum.NOT_FOO_TYPE.name(),
          String.format("Element %s is not Foo type", foo.getId())
        );
    }
}

Я пытался сделать это, но foo.getId() недоступно в orElseThrow(). Примечание: исключение BadRequestException является проверенным.

fooList.stream().filter(foo -> !FooConstant.FOO_TYPE.equals(foo.getType())
    .findFirst()
    .orElseThrow(() -> new BadRequestException(LOGGER, FooErrorEnum.NOT_FOO_TYPE.name(), String.format("Element %s is not Foo type", foo.getId()));

1 Ответ

4 голосов
/ 04 октября 2019

Вам нужно Optional#ifPresent.

fooList.stream().filter(foo -> !FooConstant.FOO_TYPE.equals(foo.getType())
                .findFirst()
                .ifPresent(foo -> {
                     throw new BadRequestException(LOGGER, FooErrorEnum.NOT_FOO_TYPE.name(), String.format("Element %s is not Foo type", foo.getId())
                });

Хотя это странно. Мы обычно используем Optional наоборот: отфильтровать недопустимые параметры и найти первый действительный. В вашем примере orElseThrow будет выполнено, когда все в порядке, поэтому не следует выдавать исключение.

Обратите внимание, что BadRequestException должно быть RuntimeException, иначе не будет компилироваться .

...