让我们说我想查看一个对象是否存在于流中,如果它不存在,则抛出异常。我可以做的一种方法是使用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
行为?试图以这种方式抛出一种不好的做法吗?
答案 0 :(得分:40)
如果您的过滤器找到了任何内容,您可以使用ifPresent()
调用来抛出异常:
values.stream()
.filter("two"::equals)
.findAny()
.ifPresent(s -> {
throw new RuntimeException("found");
});
答案 1 :(得分:24)
由于您只关心如果找到了匹配项,而不是实际找到的内容,您可以使用anyMatch
进行此操作,并且您不需要使用{{1总之:
Optional
答案 2 :(得分:1)
userOptional.ifPresent(user1 -> {throw new AlreadyExistsException("Email already exist");});
这里的中括号是强制性的,否则显示了编译时异常
{throw new AlreadyExistsException("Email already exist");}
public class AlreadyExistsException extends RuntimeException
并且异常类必须扩展运行时异常