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

假设我想查看一个对象是否存在于流中,如果它不存在,则抛出一个 Exception。一种方法是使用 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类型的行为?这样做是不是不好的做法?

77299 次浏览

如果您的过滤器发现了什么,您可以使用 ifPresent()调用来抛出异常:

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

因为您只关心找到了一个匹配的 如果,而不关心实际找到的是什么,所以您可以使用 anyMatch,而且根本不需要使用 Optional:

if (values.stream().anyMatch(s -> s.equals("two"))) {
throw new RuntimeException("two was found");
}
userOptional.ifPresent(user1 -> {throw new AlreadyExistsException("Email already exist");});

这里的中括号是强制性的,否则就会显示编译时异常

{throw new AlreadyExistsException("Email already exist");}


public class AlreadyExistsException extends RuntimeException

和异常类必须扩展运行时异常