我有以下表达式:
.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
是否可以在过滤器之前检查类型?
答案 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解决方案存在一个小问题 - 在filter
和map
中输入类名很容易出错 - 很容易忘记更改类的名称在这两个地方。一个改进的解决方案是这样的:
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