1. ホーム
  2. java

[解決済み] ストリームでinstanceofをチェックする

2022-12-06 18:45:39

質問

次のような式があります。

scheduleIntervalContainers.stream()
        .filter(sic -> ((ScheduleIntervalContainer) sic).getStartTime() != ((ScheduleIntervalContainer)sic).getEndTime())
        .collect(Collectors.toList());

...ここで scheduleIntervalContainers は要素タイプ ScheduleContainer :

final List<ScheduleContainer> scheduleIntervalContainers

フィルタの前に型を確認することは可能でしょうか?

どのように解決するのですか?

別の filter のみを維持するために ScheduleIntervalContainer のインスタンスだけを残し map を追加することで、後のキャストを省くことができます。

scheduleIntervalContainers.stream()
    .filter(sc -> sc instanceof ScheduleIntervalContainer)
    .map (sc -> (ScheduleIntervalContainer) sc)
    .filter(sic -> sic.getStartTime() != sic.getEndTime())
    .collect(Collectors.toList());

また、Holgerがコメントしたように、そのスタイルを好むのであれば、ラムダ式をメソッド参照に置き換えることができます。

scheduleIntervalContainers.stream()
    .filter(ScheduleIntervalContainer.class::isInstance)
    .map (ScheduleIntervalContainer.class::cast)
    .filter(sic -> sic.getStartTime() != sic.getEndTime())
    .collect(Collectors.toList());