检查流中的instanceof

时间:2016-03-02 07:03:16

标签: java java-8 java-stream instanceof

我有以下表达式:

.datepicker table tr td.active:active, .datepicker table tr td.active.highlighted:active, .datepicker table tr td.active.active, .datepicker table tr td.active.highlighted.active, .open > .dropdown-toggle.datepicker table tr td.active, .open > .dropdown-toggle.datepicker table tr td.active.highlighted {
    background-color: #285e8e;
    border-color: #285e8e;
    color: #ffffff;
}

...其中scheduleIntervalContainers.stream() .filter(sic -> ((ScheduleIntervalContainer) sic).getStartTime() != ((ScheduleIntervalContainer)sic).getEndTime()) .collect(Collectors.toList()); 的元素类型为scheduleIntervalContainers

ScheduleContainer

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

3 个答案:

答案 0 :(得分:101)

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

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

答案 1 :(得分:74)

您可以应用另一个filter以仅保留ScheduleIntervalContainer个实例,添加map将为您保存以后的演员:

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 :(得分:12)

@ Eran解决方案存在一个小问题 - 在filtermap中输入类名很容易出错 - 很容易忘记更改类的名称在这两个地方。一个改进的解决方案是这样的:

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());   

但是,为每个匹配元素创建Stream可能会有性能损失。小心在大型数据集上使用它。我从@ Tagir Vailev

中学到了这个解决方案