如果可选<>则抛出异常存在

时间:2015-02-19 00:43:26

标签: java java-8

让我们说我想查看一个对象是否存在于流中,如果它不存在,则抛出异常。我可以做的一种方法是使用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行为?试图以这种方式抛出一种不好的做法吗?

3 个答案:

答案 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

并且异常类必须扩展运行时异常