2017-05-31 25 views
13

我目前創建Map<String, Map<LocalDate, Integer>>這樣,那裏的Integer代表秒:如何使用Collectors.summingInt獲取自定義類型而不是整數?

Map<String, Map<LocalDate, Integer>> map = stream.collect(Collectors.groupingBy(
      x -> x.getProject(), 
      Collectors.groupingBy(
       x -> x.getDate(), 
       Collectors.summingInt(t -> t.getDuration().toSecondOfDay()) 
      ) 
     )); 

我怎麼能代替創建Map<String, Map<LocalDate, Duration>>

+0

我注意到['java.time.Duration'](https://docs.oracle.com/javase/8/docs/api/java/time/Duration.html)沒有'toSecondOfDay() '方法。你正在使用其他類型還是'getSeconds()'這個錯誤? –

+0

@DidierL我使用LocalTime來保存持續時間,它在DBMS中看起來更漂亮。 – Alex78191

+0

爲了數據庫表示的緣故,我不認爲濫用Java類型是個好主意。您應該使用特定的轉換器來映射到您選擇的數據庫類型 - 如果默認轉換不起作用。 –

回答

8

要更改IntegerCollectors.summingIntDuration,您只需更換Collector有:

Collectors.collectingAndThen(
    Collectors.summingInt(t -> t.getDuration().toSecondOfDay()), 
    Duration::ofSeconds 
) 
1

如果您正在使用的getDuration()(而不是LocalTime)實際Duration,你也可以直接總結在Duration的如下:

Map<String, Map<LocalDate, Duration>> map = stream.collect(Collectors.groupingBy(
     MyObject::getProject, 
     Collectors.groupingBy(
       MyObject::getDate, 
       Collectors.mapping(MyObject::getDuration, 
         Collectors.reducing(Duration.ZERO, Duration::plus)) 
     ) 
)); 

其優點是它也總結了納秒,並可能也可以推廣到其他類型。

但請注意,它會創建許多可能會影響性能的中間實例Duration

相關問題