J’ai l’expression suivante:
scheduleIntervalContainers.stream() .filter(sic -> ((ScheduleIntervalContainer)sic).getStartTime() != ((ScheduleIntervalContainer)sic).getEndTime()) .collect(Collectors.toList());
où scheduleIntervalContainers est de type ScheduleContainer
final List scheduleIntervalContainers
Est-il possible de vérifier le type avant le filtre?
Vous pouvez appliquer un autre filter
afin de ne conserver que les instances ScheduleIntervalContainer
, et l’ajout d’une map
permettra d’économiser les versions ultérieures:
scheduleIntervalContainers.stream() .filter(sc -> sc instanceof ScheduleIntervalContainer) .map (sc -> (ScheduleIntervalContainer) sc) .filter(sic -> sic.getStartTime() != sic.getEndTime()) .collect(Collectors.toList());
Une option assez élégante consiste à utiliser la référence de méthode de la classe:
scheduleIntervalContainers .stream() .filter( ScheduleIntervalContainer.class::isInstance ) .map( ScheduleIntervalContainer.class::cast ) .filter( sic -> sic.getStartTime() != sic.getEndTime()) .collect(Collectors.toList() );
Il y a un petit problème avec la solution @ Eran – taper le nom de la classe à la fois dans le filter
et dans la map
est sujet aux erreurs – il est facile d’oublier de changer le nom de la classe aux deux endroits. Une solution améliorée serait quelque chose comme ceci:
private static Function> select(Class 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());
Cependant, la création d’un Stream
pour chaque élément correspondant peut entraîner une pénalité de performance. Veillez à l’utiliser sur d’énormes ensembles de données. J’ai appris cette solution de @ Tagir Vailev