检查流中的实例

2022-08-31 09:57:36

我有以下表达式:

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

...其中具有元素类型:scheduleIntervalContainersScheduleContainer

final List<ScheduleContainer> scheduleIntervalContainers

是否可以在过滤器之前检查类型?


答案 1

您可以应用另一个以仅保留实例,并且添加一个将节省以后的转换:filterScheduleIntervalContainermap

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

或者,正如 Holger 所评论的那样,如果您更喜欢该样式,则可以将 lambda 表达式替换为方法引用:

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

答案 2

一个非常优雅的选择是使用类的方法引用:

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