Eu tenho um predicado que eu uso para filtrar uma lista do mesmo objeto de entidade:
Predicate<DWHDeal> companyFilter = i -> i.getCompany().equals(company);
Também preciso aplicar o mesmo filtro, com a mesma condição exata no mesmo campo, em uma lista de DTOs em que o DTOS é criado com base na entidade anterior:
Predicate<DWHDealDTO> companyFilterDTO = i -> i.getCompany().equals(company);
É possível conseguir isso sem instanciar dois predicados diferentes? Se possível, eu gostaria de conseguir isso fazendo apenas um Predicate
.
DWHDealDTO
eDWHDeal
relacionados? (como estender a mesma classe)getCompany()
o mesmo tipo nos dois casos?Predicate
com uma classe comum ou tentar escrever um método que aceite ambosDWHDeal
eDWHDealDTO
, como parâmetro. Se essas classes não tiverem interface ou superclasse comum declarando um método comum, elas não terão um método comum, apenas dois métodos não relacionados que tenham o mesmo nome.Respostas:
Supondo
getCompany()
retornos a,String
você pode criarPredicate<String>
:E depois usá-lo como:
Mas não há muitos benefícios, pois requer quase o mesmo código.
fonte
Se a igualdade for apenas verificar, você poderá usar o Predicate isEqual estático (Object targetRef). consulte java doc https://docs.oracle.com/javase/8/docs/api/java/util/function/Predicate.html#isEqual-java.lang.Object-
fonte
Eu acho que você precisará de um
Function<T,R>
antes de usarPredicate
:Existem dois conceitos para Function. Primeiro é um
java.util.function.Function
que aceita um argumento e produz um resultado . O segundo é o mapa de operação intermediária do fluxo, que converte cada elemento em um fluxo em outro objeto por meio da função fornecida.No seu caso,
Function
deve parecer com:Eu tentei o programa básico como abaixo com sucesso:
fonte
Conforme sugerido nos comentários, a interface comum seria a solução preferida.
Eu acho que você poderia fazer algo assim, mas para ser justo, é feio.
fonte