Подтвердить что ты не робот

Выбросить исключение, если присутствует необязательный <>

Скажем, я хочу посмотреть, существует ли объект в потоке, а если нет, то выбросьте исключение. Один из способов, который я мог бы сделать, - использовать метод orElseThrow:

List<String> values = new ArrayList<>();
values.add("one");
//values.add("two");  // exception thrown
values.add("three");
String two = values.stream()
        .filter(s -> s.equals("two"))
        .findAny()
        .orElseThrow(() -> new RuntimeException("not found"));

А как насчет обратного? Если я хочу создать исключение, если найдено какое-либо совпадение:

String two = values.stream()
        .filter(s -> s.equals("two"))
        .findAny()
        .ifPresentThrow(() -> new RuntimeException("not found"));

Я мог бы просто сохранить Optional и выполнить проверку isPresent после:

Optional<String> two = values.stream()
        .filter(s -> s.equals("two"))
        .findAny();
if (two.isPresent()) {
    throw new RuntimeException("not found");
}

Есть ли способ достичь этого поведения ifPresentThrow? Является ли попытка сделать таким образом плохую практику?

4b9b3361

Ответ 1

Поскольку вам все равно , если найдено совпадение, а не то, что было найдено, вы можете использовать anyMatch для этого, и вам не нужно использовать Optional вообще:

if (values.stream().anyMatch(s -> s.equals("two"))) {
    throw new RuntimeException("two was found");
}

Ответ 2

Вы можете использовать вызов ifPresent() для генерирования исключения, если ваш фильтр находит что-либо:

    values.stream()
            .filter("two"::equals)
            .findAny()
            .ifPresent(s -> {
                throw new RuntimeException("found");
            });