【问题标题】:Java 8 stream - cast list items to type of subclassJava 8 流 - 将列表项转换为子类的类型
【发布时间】:2016-03-02 09:45:48
【问题描述】:

我有一个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());

【问题讨论】:

  • 这还不清楚。请发帖minimal reproducible example
  • 你在四个小时前问了同样的问题。
  • 最简单的方法是使用方法参考:.map( ScheduleIntervalContainer.class::cast ),正如 Jon Skeet 在下面的评论中所建议的那样,以及 OP 稍后对一个相关但不同的问题的回答。跨度>

标签: java java-8


【解决方案1】:

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

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

object instanceof ScheduleIntervalContainer

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

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

所以,整个流程应该是这样的:

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

【讨论】:

  • 没有同时过滤和投射的收集(如在 scala 中)吗?
【解决方案2】:

您的意思是要转换每个元素吗?

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

如果您觉得更清楚,也可以使用方法参考

                                            .map(ScheduleIntervalContainer.class::cast)

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

【讨论】:

  • 方法参考在这里有用吗? map(ScheduleIntervalContainer.class::cast) 会尽可能地亲自尝试。不确定它是否更具可读性,但我很感兴趣 :)
  • @JonSkeet 我以前用过它,但似乎不必要的聪明/晦涩。
  • map(ScheduleIntervalContainer.class::cast) -> 这正是我所需要的 - 谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-22
  • 1970-01-01
  • 2010-12-02
相关资源
最近更新 更多