Есть ли способ имитировать селекторы свойств в Java? - PullRequest
1 голос
/ 05 мая 2019

В C # у нас есть возможность указать свойство объекта с помощью селекторов свойств (например, при использовании LINQ), например так:

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

Здесь мы сначала выбираем свойство Age для выполнениясравните, а затем укажите свойство Username в предложении Select(...).

В настоящее время я пытаюсь воспроизвести эту функцию, используя лямбда-выражения в Java, чтобы пользователи моего кода могли указать, какое свойство следует использовать длянекоторые действия позже.Окончательный результат должен выглядеть примерно так:

public class Builder<T> {

// ...
private Field field;

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

Спасибо за ваши усилия.

Ответы [ 3 ]

2 голосов
/ 05 мая 2019

Пример ниже будет скомпилирован без ошибки:

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 полям, вам нужен геттер для них.

0 голосов
/ 15 мая 2019

Я автор Linq to Objects (Java). Вы можете использовать lombok и Linq для этого.

val result = Linq.asEnumerable(customers).where(customer -> customer.getAge() > 20).select(customer -> customer.getUserName());

Ломбок

Linq

0 голосов
/ 05 мая 2019

Для этого вы можете использовать потоковый API:

customers.stream().filter(customer => customer.getAge() > 20).map(Customer::getUserName).collect(Collectors.toList())
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...