Tengo una situación inesperada en un proyecto en el que todos los tipos que extienden una clase se empaquetan en una colección Java; pero solo una extensión específica de esa clase contiene un método adicional. Llamémoslo "también ()"; y déjenme aclarar que ninguna otra extensión lo tiene. Justo antes de realizar una tarea en cada elemento de esa colección, necesito llamar también () a cada elemento que lo implemente.
La forma más fácil de avanzar es esta:
stuff.stream().filter(item -> item instanceof SpecificItem)
.forEach(item -> ((SpecificItem)item).also()));
stuff.stream().forEach(item -> item.method());
Funciona bien, pero no me siento cómodo con la "instancia de" allí. Eso generalmente es un marcador de mal olor del código. Es muy posible que refactorice esta clase solo para deshacerme de ella. Sin embargo, antes de hacer algo tan dramático, pensé en consultar con la comunidad y ver si alguien con más experiencia con Streams o Collections tenía una solución más simple.
Como ejemplo (ciertamente no exclusivo), ¿es posible obtener una vista de una colección que filtre las entradas por clase?
.getKind()
o .isSpecific()
?
SpecificItem
la implementación no solo llame also()
primero?
Iterable
no tiene un stream()
método, pero puede llamar forEach()
directamente a un Iterable
.
SpecificItem
, y esta es la forma correcta de especificar el predicado, entonces, ¿por qué le preocupa tantoinstanceof
estar allí?