如何创建基于条件的多重过滤器并返回非布尔值?

时间:2019-01-21 23:04:13

标签: java

尝试根据条件应用多个过滤器,伪代码为:

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));

2 个答案:

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