¿Hay alguna manera de simular selectores de propiedades en Java?

En C # tenemos la opción de especificar una propiedad de un objeto usando selectores de propiedades (por ejemplo, cuando se usa LINQ) de esta manera:

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

Aquí seleccionamos primero la propiedad Agepara realizar la comparación y luego especificamos la propiedad Usernamea la Select(...)cláusula.

Actualmente estoy tratando de replicar esta funcionalidad usando expresiones lambda en Java para permitir a los usuarios de mi código especificar qué propiedad se debe usar para alguna acción más adelante. El resultado final debería ser similar al siguiente:

public class Builder<T> {

// ...
private Field field;

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

Gracias por tu esfuerzo.

Respuesta 1

El siguiente ejemplo se compilará sin error:

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;
  }
}

No puedes acceder private embargo, campos directamente, necesita un captador para ellos.

Respuesta: 2

Puede usar la API de transmisión para esto:

customers.stream().filter(customer => customer.getAge() > 20).map(Customer::getUserName).collect(Collectors.toList())
Respuesta: 3

Tengo que generar registros para cada "usuario" de nuestra aplicación web. Para eso, utilizamos un SiftingAppender con un discriminador. <appender name = "SEPARATED" class = "ch.qos.logback.classic.sift ....

Estoy trabajando en un problema de tarea. En este momento, tengo una lista de nombres. Tengo una función que debería agregar el nombre a la Lista, y otra que debería obtenerlo. Sin embargo, solo obtiene una cadena vacía ...

Me gustaría aplicar Java concurrente, es decir, invocable para el conjunto de resultados. El escenario es: consulta la base de datos utilizando JDBC. Envíe el conjunto de resultados a invocable para escribir en diferentes archivos. Como los datos serían ...

Estoy tratando de calcular más rápido mi programa. Pero usar hilo lo hace más lento. Aquí está el código que simplificó: en esta matriz, tratando de sumar cada dígito. Por ejemplo: dígitos de la unidad = 3 + 6 Lista & ...