java - 有没有办法在java中模拟属性选择器?

标签 java c# reflection

在 C# 中,我们可以选择使用属性选择器指定对象的属性(例如使用 LINQ 时),如下所示:

var usernames = customers.Where(x => x.Age > 20).Select(x => x.Username);

这里我们首先选择要执行比较的属性Age,然后将属性Username指定给Select(...)条款。

我目前正在尝试使用 Java 中的 lambda 表达式来复制此功能,以使我的代码的用户能够指定稍后应将哪个属性用于某些操作。最终结果应类似于以下内容:

public class Builder<T> {

// ...
private Field field;

Builder<T> forField(SomeFunctionalInterface s) {
    this.field = s.evaluate();
    return this;
 }
// ...
}

感谢您的努力。

最佳答案

下面的例子将编译没有错误:

public void test() {
  from(Customer.class).where(c -> c.getAge() > 20).select(Customer::getUserName);
}

public <T> Builder<T> from(Class<T> cls) {
  return new Builder<>(cls);
}

public class Builder<T> {
  private Class<T> cls;

  public Builder(Class<T> cls) {
    this.cls = cls;
  }

  public Builder<T> where(Predicate<T> predicate) {
    // store predicate
    return this;
  }

  public Builder<T> select(Function<T, Object> field) {
    // store field selector
    return this;
  }
}

public class Customer {
  private String userName;
  private int age;

  public int getAge() {
    return age;
  }

  public String getUserName() {
    return userName;
  }
}

但是您无法直接访问 private 字段,您需要为它们提供 getter。

关于java - 有没有办法在java中模拟属性选择器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55989763/

相关文章:

c# - 将整数转换为仅在运行时已知的盒装枚举类型

c# - 如何制作使用同一程序集中的静态变量的动态方法?

c# - 通过变量引用属性名称

java - Spring LDAP 和 MemberOf

Java 包不存在错误

c# - 回发中丢失的数据

c# - 如何从 Session 中删除一个值?

java - 为什么在HashMap.keySet()中声明局部变量ks?

java - 如何为枚举的每个条目添加描述?

c# - 线程在 httpClient.PostAsync 中被中止