有没有办法在java中模拟属性选择器?
在C中,我们可以选择使用属性选择器指定对象的属性,例如使用LINQ时,如:有没有办法在java中模拟属性选择器?,java,c#,reflection,Java,C#,Reflection,在C中,我们可以选择使用属性选择器指定对象的属性,例如使用LINQ时,如: var usernames = customers.Where(x => x.Age > 20).Select(x => x.Username); 在这里,我们首先选择要执行比较的属性年龄,然后将属性用户名指定给select。。。条款 我目前正在尝试使用Java中的lambda表达式复制此功能,以使代码的用户能够指定稍后应将哪个属性用于某些操作。最终结果应类似于以下内容: public class B
var usernames = customers.Where(x => x.Age > 20).Select(x => x.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;
}
}
但是,您不能直接访问私有字段,您需要一个getter来访问它们。您可以为此使用流API:
customers.stream().filter(customer => customer.getAge() > 20).map(Customer::getUserName).collect(Collectors.toList())
我是Linq to ObjectsJava的作者。您可以使用lombok和Linq来实现这一点
val result = Linq.asEnumerable(customers).where(customer -> customer.getAge() > 20).select(customer -> customer.getUserName());
为什么不能直接使用流呢?等价物是customers.stream.filterx->x.getAge>20.mapx->x.getUserName,后面可能跟一个.collectCollectors.toList