如果存在可选<>,则引发异常

2022-08-31 13:18:07

假设我想查看流中是否存在某个对象,如果它不存在,则引发异常。我可以做到这一点的一种方法是使用该方法: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"));

我可以只存储 ,并在以下之后进行检查:OptionalisPresent

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

有没有办法实现这种行为?试图以这种方式投掷是一种不好的做法吗?ifPresentThrow


答案 1

如果您的过滤器找到任何内容,您可以使用该调用引发异常:ifPresent()

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

答案 2

由于您只关心是否找到了匹配项,而不是实际找到的内容,因此您可以使用它,并且根本不需要使用:anyMatchOptional

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

推荐