尝试根据条件应用多个过滤器,伪代码为:
if TypeA exception
then throw TypeA Exception
if TypeB
then throw TypeB Exception
else TypeC Exception.
我不知道如何使用基于条件的过滤器:
List<InvalidArgumentException> invalidEx = e.getInvalidException();
return invalidEx.stream()
.filter (ic -> {
if(ic.getInvalidExcepType().equals(ExceptionType.TypeA)) {
return (RuntimeException) new TypeAException(e);
} else if (ic.getInvalidExcepType().equals(ExceptionType.TypeB))
return (RuntimeException) new TypeBException(e);
}).orElse (new TypeCException(e));
答案 0 :(得分:1)
您无需使用filter
(它只返回Stream
中与给定谓词匹配的所有元素),而是需要使用map
:
return invalidEx.stream()
.map(ic -> {
if(ic.getInvalidExcepType().equals(ExceptionType.TypeA)) {
return (RuntimeException) new TypeAException(e);
} else if (ic.getInvalidExcepType().equals(ExceptionType.TypeB)) {
return (RuntimeException) new TypeBException(e);
} else {
return new TypeCException(e);
}
}).collect(Collectors.toList());
(或其他一些终端操作)
答案 1 :(得分:1)
正如其他人所说,如果您有很多可能的ExceptionType,并且想创建一些可以解决这些问题而又不需要很长的ifs的情况,那么您想使用map而不是filter,我相信您可以创建一些东西这样。
class ExceptionResolver {
private static Map<ExceptionType, Function<InvalidArgumentException, RuntimeException>> exceptionMapping = new HashMap<>();
static {
exceptionMapping.put(ExceptionType.TypeA, TypeAException::new);
exceptionMapping.put(ExceptionType.TypeB, TypeBException::new);
}
static RuntimeException resolveException(ExceptionType type, InvalidArgumentException e) {
return exceptionMapping.get(type).apply(e);
}
}
然后像这样使用它
List<InvalidArgumentException> invalidEx = e.getInvalidException();
return invalidEx.stream()
.map(f -> ExceptionResolver.resolveException(f.getInvalidExceptionType(), f));