java 在运行时获取Lambda表达式的某种表示

vq8itlhq  于 2022-11-27  发布在  Java
关注(0)|答案(1)|浏览(95)

我想使用类似这样的方法来检查一些条件,但问题是我需要知道哪个条件失败并记录异常,这种方法确实可以实现,但依赖于知道代码中检查的位置,这并不理想,有没有其他更好的方法来做到这一点?(不会使调用函数的时间更长)
第一个

j7dteeu8

j7dteeu81#

您可能会对Decorator design patter感兴趣。
也就是说,你可以创建一个修饰你选择的函数接口的实现。看起来PredicateBooleanSupplier更适合你,因此下面的例子说明了一个抛出 predicate ,它期望一个 predicate ,目标异常的产生器,消息和记录器作为参数,它的test()实现委托给 Package predicate 来评估条件。
trowing Predicate的示例可用于需要Predicate的任何地方。

public class ThrowingLoggPredicate<T> implements Predicate<T> {
    private Predicate<T> predicate;
    private Function<String, RuntimeException> exceptionFactory;
    private String messageShort;
    private String format;
    private Logger logger;
    
    public ThrowingLoggPredicate(Predicate<T> predicate,
                                 Function<String, RuntimeException> exceptionFactory,
                                 String messageShort, String format,
                                 Logger logger) {
        
        this.predicate = predicate;
        this.exceptionFactory = exceptionFactory;
        this.messageShort = messageShort;
        this.format = format;
        this.logger = logger;
    }
    
    public boolean test(T t) {
        if (!predicate.test(t)) {
            RuntimeException e = exceptionFactory.apply(messageShort);
            String messageVerbose = String.format(format, t);
            logger.log(Level.ERROR, messageVerbose, e);
            throw e;
        }
        return true;
    }
    
    public static <T> boolean allMatch(Collection<Predicate<T>> predicates, T t) {
        
        return predicates.stream().allMatch(p -> p.test(t));
    }
}

相关问题