Java 8 流 - 将列表项转换为子类的类型

2022-09-02 02:10:47

我有一个对象列表,在流中,每个元素都应该被强制转换为类型。有没有办法做到这一点?ScheduleContainerScheduleIntervalContainer

final List<ScheduleContainer> scheduleIntervalContainersReducedOfSameTimes

final List<List<ScheduleContainer>> scheduleIntervalContainerOfCurrentDay = new ArrayList<>(
        scheduleIntervalContainersReducedOfSameTimes.stream()
            .sorted(Comparator.comparing(ScheduleIntervalContainer::getStartDate).reversed())
            .filter(s -> s.getStartDate().withTimeAtStartOfDay().isEqual(today.withTimeAtStartOfDay())).collect(Collectors
                .groupingBy(ScheduleIntervalContainer::getStartDate, LinkedHashMap::new, Collectors.<ScheduleContainer> toList()))
            .values());

答案 1

这是可能的,但你应该首先考虑是否需要强制转换,或者只是函数应该从一开始就对子类类型进行操作。

下沉抛需要特别小心,您应该首先检查给定的对象是否可以通过以下方式下沉:

object instanceof ScheduleIntervalContainer

然后,您可以通过以下方式很好地投射它:

使用函数式方法像 ScheduleIntervalContainer 一样进行转换.class::cast

因此,整个流程应如下所示:

collection.stream()
    .filter(obj -> obj instanceof ScheduleIntervalContainer)
    .map(ScheduleIntervalContainer.class::cast)
    // other operations

答案 2

您的意思是要投射每个元素吗?

scheduleIntervalContainersReducedOfSameTimes.stream()
                                            .map(sic -> (ScheduleIntervalContainer) sic)
                // now I have a Stream<ScheduleIntervalContainer>

或者,如果您觉得方法参考更清晰,则可以使用它

                                            .map(ScheduleIntervalContainer.class::cast)

关于性能说明;第一个示例是非捕获 lambda,因此它不会创建任何垃圾,但第二个示例是捕获 lambda,因此每次对其进行分类时都可以创建一个对象。


推荐