Eu tenho uma situação inesperada em um projeto no qual todos os tipos que estendem uma classe são compactados em uma coleção Java; mas apenas uma extensão específica dessa classe contém um método adicional. Vamos chamar de "also ()"; e deixe-me esclarecer que nenhuma outra extensão possui. Antes de executar uma tarefa em cada item dessa coleção, preciso chamar também () todos os itens que a implementam.
O caminho mais fácil é o seguinte:
stuff.stream().filter(item -> item instanceof SpecificItem)
.forEach(item -> ((SpecificItem)item).also()));
stuff.stream().forEach(item -> item.method());
Funciona bem, mas não me sinto confortável com a "instânciaof" lá. Isso geralmente é um marcador de mau cheiro de código. É muito possível que eu refatore essa classe apenas para me livrar dela. Antes de fazer algo tão dramático, pensei em verificar com a comunidade e ver se alguém com mais experiência no Streams ou no Collections tinha uma solução mais simples.
Como exemplo (certamente não exclusivo), é possível obter uma visão de uma coleção que filtra entradas por classe?
.getKind()
ou .isSpecific()
?
SpecificItem
para a implementação não chamar apenas also()
primeiro?
Iterable
não tem um stream()
método, mas você pode chamar forEach()
diretamente em um Iterable
.
SpecificItem
, e esta é a maneira correta de especificar o predicado, então por que você é sensível sobre o fato deinstanceof
estar lá?