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

xu3bshqb  于 2023-01-29  发布在  Java
关注(0)|答案(2)|浏览(231)

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

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

xqkwcwgp1#

这是可能的,但是你应该首先考虑你是否需要强制类型转换,或者只是函数应该从一开始就对子类类型进行操作。
下落需要特别小心,首先应检查给定物体是否可以通过以下方式下落:

object instanceof ScheduleIntervalContainer

然后,您可以通过以下方式很好地进行造型:
使用函数方法强制转换为ScheduleIntervalContainer.class::cast
因此,整个流程应如下所示:

collection.stream()
    .filter(ScheduleIntervalContainer.class::isInstance)
    .map(ScheduleIntervalContainer.class::cast)
    // other operations
iswrvxsc

iswrvxsc2#

你的意思是你要铸造每一个元素?

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

或者,如果您觉得方法引用更清楚,也可以使用方法引用

.map(ScheduleIntervalContainer.class::cast)

在性能笔记上;第一个例子是一个非捕获lambda,因此它不会创建任何垃圾,但第二个例子是一个捕获lambda,因此可以在每次对它进行类化时创建一个对象。

相关问题