Tengo un predicado que uso para filtrar una lista del mismo Objeto de entidad:
Predicate<DWHDeal> companyFilter = i -> i.getCompany().equals(company);
También tengo que aplicar el mismo filtro, con exactamente la misma condición en el mismo campo, en una lista de DTO donde se construye el DTOS basado en la entidad de antes:
Predicate<DWHDealDTO> companyFilterDTO = i -> i.getCompany().equals(company);
¿Es posible lograr esto sin instaurar dos predicados diferentes? Si es posible, me gustaría lograr esto haciendo solo uno Predicate
.
DWHDealDTO
yDWHDeal
relacionados? (como extender la misma clase)getCompany()
Devuelve el mismo tipo en ambos casos?Predicate
con una clase ordinaria o tratar de escribir un método que acepte ambasDWHDeal
yDWHDealDTO
, como parámetro. Si estas clases no tienen una interfaz común o una superclase que declare un método común, no tienen un método común, solo dos métodos no relacionados que tienen el mismo nombre.Respuestas:
Suponiendo que
getCompany()
devuelve unString
que podría crearPredicate<String>
:Y luego usándolo como:
Pero no hay muchos beneficios ya que requiere casi el mismo código.
fuente
Si la igualdad es solo verificar, entonces puede usar Predicate estático isEqual (Object targetRef). ver java doc https://docs.oracle.com/javase/8/docs/api/java/util/function/Predicate.html#isEqual-java.lang.Object-
fuente
Creo que necesitará un
Function<T,R>
antes de usarPredicate
:Hay dos conceptos para la función. Primero es un
java.util.function.Function
que acepta un argumento y produce un resultado . El segundo es el mapa de operación intermedia de flujo que convierte cada elemento en un flujo en otro objeto a través de la función suministrada.En su caso,
Function
debería verse así:Probé el programa básico de la siguiente manera con éxito:
fuente
Como se sugiere en los comentarios, la interfaz común sería la solución preferida.
Supongo que podrías hacer algo como esto, pero para ser justos, es feo.
fuente