2016-03-02 42 views
1

我有一个ScheduleContainer类型的列表和插入流每个元素应该被铸造到类型ScheduleIntervalContainer。有没有办法做到这一点?Java 8流播放列表项目的子类型

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

这还不清楚。请发布[mcve]。 – Tunaki

+1

你四小时前问完全相同的问题。 – Holger

回答

4

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

向下转换需要特别小心,你应该先检查是否给定的对象可以通过铸造下来:

(ScheduleIntervalContainer) object 

所以,整个流程应该:

object instanceof ScheduleIntervalContainer 

然后你就可以很好地将其丢看起来像:

collection.stream() 
    .filter(obj -> obj instanceof ScheduleIntervalContainer) 
    .map(obj -> (ScheduleIntervalContainer) obj) 
    // other operations 
6

你的意思是你想要投射每个元素?

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

或者,如果你觉得这是更清晰

          .map(ScheduleIntervalContainer.class::cast) 

上的演奏音符,你可以使用的方法参考;第一个例子是一个非捕获lambda,所以它不会创建任何垃圾,但第二个例子是捕获lambda,所以每次分类时都可以创建一个对象。

+2

方法参考在这里工作吗? 'map(ScheduleIntervalContainer.class :: cast)''''''''''''''''''''''''''不知道它更具可读性,但我很感兴趣:) –

+0

@JonSkeet刚刚检查过它,效果不错,看起来不错 –

+0

@JonSkeet我之前使用过它,但似乎不必要地聪明/模糊。 –