Tengo la siguiente expresión:
scheduleIntervalContainers.stream()
.filter(sic -> ((ScheduleIntervalContainer) sic).getStartTime() != ((ScheduleIntervalContainer)sic).getEndTime())
.collect(Collectors.toList());
... donde scheduleIntervalContainerstiene 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
.classnecesario? no esisInstanceparte deObject? ¿EsClassuna clase en Java?ScheduleIntervalContainerno sería realmente una instancia.Hay un pequeño problema con la solución @ Eran : escribir el nombre de la clase en ambos
filterymapes 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
Streampara cada elemento coincidente. Tenga cuidado de usarlo en grandes conjuntos de datos. Aprendí esta solución de @ Tagir Vailevfuente
select(A.class)que devolveránullcualquier cosa que no sea unA. Agregar.filter(Objects::nonNull)ayudaría. Por cierto: el enfoque de @Eran es seguro para nulos.flatMapdice "Si una secuencia asignada es nula, se usa una secuencia vacía". Entonces su solución fue correcta, incluso sin el filtro nulo.nullcuando podría haber devuelto una transmisión vacía