具有未经检查的异常的选项

Optionals with unchecked exceptions

考虑以下代码:

auditlog.getMessages()
    .stream()
    .filter(m -> messageId.equals(m.getMessageid()))
    .findFirst()
    .orElseThrow(NoMessageFoundException::new)

NoMessageFoundException 是一个自定义的未经检查的异常,从 RuntimeException 扩展而来。当 findFirst() returns 一个空的可选时,我希望抛出 NoMessageFoundException,但是,代码只是继续。

是否无法使用未经检查的异常来执行此操作?

我可以将 NoMessageFoundException 更改为已检查的异常,但随后我将不得不编写一个 try/catch 块或某种包装器来捕获异常,如 here 所述,但我希望不要那样做。

有什么想法吗?

可以抛出的异常类型没有限制。

public <X extends Throwable> T orElseThrow(Supplier<? extends X> exceptionSupplier) throws X {
    if (value != null) {
        return value;
    } else {
        throw exceptionSupplier.get();
    }
}

如果代码"carries on",表示找到了一条消息。

如果没有抛出异常是因为过滤操作后至少有一个元素剩余...

看这个例子:

public class ASFasf {
    public static void main(String[] args) {
        List<Integer> l = Arrays.asList(1, 2, 3, 4, 5);
        Integer iR = l.stream().filter(x -> x > 100).findFirst().orElseThrow(NoMessageFoundException::new);
        System.out.println(iR);
    }
}

class NoMessageFoundException extends RuntimeException {
    public NoMessageFoundException() {
        super("Opala!!");
    }
}

iR 将永远不会被打印,并且会抛出 NoMessageFoundException....