Ich habe folgenden Ausdruck:
scheduleIntervalContainers.stream()
.filter(sic -> ((ScheduleIntervalContainer) sic).getStartTime() != ((ScheduleIntervalContainer)sic).getEndTime())
.collect(Collectors.toList());
... wo scheduleIntervalContainers
hat Elementtyp ScheduleContainer
:
final List<ScheduleContainer> scheduleIntervalContainers
Ist es möglich, den Typ vor dem Filter zu überprüfen?
.filter(ScheduleIntervalContainer.class::isInstance) .map(ScheduleIntervalContainer.class::cast)
welchen Stil Sie bevorzugen.List<ScheduleContainer>
oder einem zuzuweisenList<ScheduleIntervalContainer>
? Es sollte das letztere sein.Eine ziemlich elegante Option ist die Verwendung der Methodenreferenz der Klasse:
quelle
.class
erforderlich? ist nichtisInstance
Teil vonObject
? IstClass
eine Klasse in Java?ScheduleIntervalContainer
wäre es nicht wirklich eine Instanz.Es gibt ein kleines Problem mit der @ Eran- Lösung - die Eingabe des Klassennamens in beiden
filter
undmap
ist fehleranfällig - es ist leicht zu vergessen, den Namen der Klasse an beiden Stellen zu ändern. Eine verbesserte Lösung wäre ungefähr so: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());
Es kann jedoch zu Leistungseinbußen kommen, wenn
Stream
für jedes übereinstimmende Element ein erstellt wird. Seien Sie vorsichtig, wenn Sie es für große Datenmengen verwenden. Ich habe diese Lösung von @ Tagir Vailev gelerntquelle
select(A.class)
kehrtnull
für alles , was nicht istA
. Hinzufügen.filter(Objects::nonNull)
würde helfen. Übrigens: @ Erans Ansatz ist nullsicher.flatMap
sagt "Wenn ein zugeordneter Stream null ist, wird stattdessen ein leerer Stream verwendet.". Ihre Lösung war also auch ohne den Nullfilter korrekt.null
wenn Sie gerade einen leeren Stream hätten zurückgeben können