在字段上使用谓词进行查询

时间:2017-05-05 11:58:12

标签: java lambda functional-programming predicate higher-order-functions

我正在搞乱lambdas,我正在尝试创建一种通用方法来为字段上的类形成谓词。以下是一些代码来说明:

public class A {

private String b;
private String c;

public A(String b, String c) {
    this.b = b;
    this.c = c;
}

public String getB() {
    return b;
}

public String getC() {
    return c;
}

}

public class Main {

public static void main(String[] args) {
    List<A> list = Arrays.asList(new A("aa","bb"),new A("aaC","bb"));
    Test test = new Test();
    test.setList(list);
    test.createPred("aa");
}

}


public class Test {

private List<A> list;

public void setList(List<A> list) {
    this.list = list;
}

public Predicate<A> createPred(String query) {
    return new Predicate<A>() {
        @Override
        public boolean test(A t) {
            return t.getB().equals(query);
        }
    };
}

public List<A> search(Predicate<A> a) {
    return list.stream().filter(a).collect(Collectors.toList());
}
}

我如何编写createPred以便它可以占用一个字段?我想这个方法是“字段通用的”我想。我猜这里使用java反射不是一个好主意。

1 个答案:

答案 0 :(得分:1)

您可以使您的方法使用Function和T作为查询字段。

  public static void main(String[] args) {
    List<A> list = Arrays.asList(new A("aa", "bb"), new A("aaC", "bb"));
    Test test = new Test();
    test.setList(list);
    test.createPred("aa", A::getB);
  }



  public static class Test {

    private List<A> list;

    public void setList(List<A> list) {
      this.list = list;
    }

    public <T> Predicate<A> createPred(T query, Function<A, T> f) {
      return new Predicate<A>() {
        @Override
        public boolean test(A x) {
          return f.apply(x).equals(query);
        }
      };
    }

    public List<A> search(Predicate<A> a) {
      return list.stream().filter(a).collect(Collectors.toList());
    }
  }