命名谓词

时间:2014-07-16 16:51:44

标签: java lambda

我有一个类来验证私有成员变量是否匹配作为谓词传入的某些条件

public class Verifiable<T> {
  private final T t;

  private Verifiable(T t) {
    this.t = t;
  }

  public static <T> Verifiable<T> of(T objToBeVerified) {
    return new Verifiable<T>(objToBeVerified);
  }

  public List<Predicate<T> verify(List<Predicate<T>> predicates) {
    // test against each predicate and return the failed predicates
  }
}

Usage:
  List<Predicate<T>> predicatesToTest = ...
  List<Predicate<T>> failedPredicates = Verifiable.of(someObj).verify(predicatesToTest);

我想打印失败的谓词,特别是谓词测试的内容。我可以通过创建实现Predicate的类的实例来实现这一点,比如NamedPredicate。该类可以包含名为“name”的成员变量。这种方法至少有两个限制:无法传递lambda表达式,并且需要创建NamedPredicate的实例。

这个问题有更好的解决方案吗?

1 个答案:

答案 0 :(得分:3)

因此,您需要将String绑定到Predicate

1)创建类似元组的内容,这是NamedPredicate背后的想法。

public class NamedPredicate<T> {
  Predicate<T> predicate ;
  String name ;
}

请始终支持封装而不是继承,并避免使用此类

public class NamedPredicate<T> extends Predicate<T> {
  String name ;
}

2)使用MapMap<String, Predicate<T>>应该可以做到这一点,但您可以使用Map<Predicate<T>, String>取决于您的架构。

public List<Predicate<T> verify(Map<String, Predicate<T>> predicates) {
  List<Predicate<T>> failed = new ArrayList<>();
  for( String name : predicates.keySet() ){
    System.out.println("Testing "+name+" on "+t);
    // test predicates.get(name), add failed test to failed list.
  }
  return failed ;
}