Tengo la siguiente expresión:
scheduleIntervalContainers.stream()
.filter(sic -> ((ScheduleIntervalContainer) sic).getStartTime() != ((ScheduleIntervalContainer)sic).getEndTime())
.collect(Collectors.toList());
... donde scheduleIntervalContainers
tiene el tipo de elemento ScheduleContainer
:
final List<ScheduleContainer> scheduleIntervalContainers
¿Es posible comprobar el tipo antes del filtro?
.filter(ScheduleIntervalContainer.class::isInstance) .map(ScheduleIntervalContainer.class::cast)
estilo que prefieras.List<ScheduleContainer>
o aList<ScheduleIntervalContainer>
? Debería ser lo último.Una opción bastante elegante es usar la referencia de método de la clase:
fuente
.class
necesario? no esisInstance
parte deObject
? ¿EsClass
una clase en Java?ScheduleIntervalContainer
no sería realmente una instancia.Hay un pequeño problema con la solución @ Eran : escribir el nombre de la clase en ambos
filter
ymap
es propenso a errores: es fácil olvidarse de cambiar el nombre de la clase en ambos lugares. Una solución mejorada sería algo como esto:private static <T, R> Function<T, Stream<R>> select(Class<R> clazz) { return e -> clazz.isInstance(e) ? Stream.of(clazz.cast(e)) : null; } scheduleIntervalContainers .stream() .flatMap(select(ScheduleIntervalContainer.class)) .filter( sic -> sic.getStartTime() != sic.getEndTime()) .collect(Collectors.toList());
Sin embargo, puede haber una penalización de rendimiento al crear un
Stream
para cada elemento coincidente. Tenga cuidado de usarlo en grandes conjuntos de datos. Aprendí esta solución de @ Tagir Vailevfuente
select(A.class)
que devolveránull
cualquier cosa que no sea unA
. Agregar.filter(Objects::nonNull)
ayudaría. Por cierto: el enfoque de @Eran es seguro para nulos.flatMap
dice "Si una secuencia asignada es nula, se usa una secuencia vacía". Entonces su solución fue correcta, incluso sin el filtro nulo.null
cuando podría haber devuelto una transmisión vacía