2016-03-02 45 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我之前使用過它,但似乎不必要地聰明/模糊。 –