我有一个 Activity 列表 (Activity),我想确定 Map(String, DateTime)
形式的数据结构(不是 Duration 或 Period;DateTime
这是必须的)映射。对于每个 Activity ,在监控期间计算的总持续时间。
Activity 类有:activityLabel(String)
、startTime(DateTime)
、endTime(DateTime)
。我使用joda
时间。
这就是我所做的:
Map<String, DateTime> durations = activities.stream().collect(Collectors.toMap(
it -> it.activityLabel,
it ->new DateTime(0,0,0,0,0,0)
//,DateTime::plus
));
我想我应该使用 DateTime plus(ReadablePeriod period)或 DateTime plus(ReadableDuration duration) ,但我不知道如何将 Duration 或 Period 类型的参数发送到方法引用。
我怎样才能达到这个结果?
编辑:对于输入:
2011-12-03 01:00:00 2011-12-03 9:00:00 sleep
2011-12-04 03:00:00 2011-12-04 10:30:00 sleep
我应该得到输出:Sleeping 0-0-0 15:30:00 (years,months,days,hours,minutes,seconds)
最佳答案
代码(使用句点)如下所示:
Map<String, Period> map = activities.stream()
.collect(Collectors.toMap(Activity::activityLabel, ac -> new Period(ac.getStartTime(), ac.getEndTime()),
(left, right) -> left.plus(right)));
如果您真的想将 Period
输出为字符串,您需要 PeriodFormatter
。
private static PeriodFormatter periodFormatter() {
return new PeriodFormatterBuilder()
.printZeroAlways()
.minimumPrintedDigits(2)
.appendYears().appendSeparator("-")
.appendMonths().appendSeparator("-")
.appendDays().appendLiteral(" ")
.appendHours().appendSeparator(":")
.appendMinutes().appendSeparator(":")
.appendSeconds().toFormatter();
}
然后你的代码看起来更像这样:
Map<String, String> map = activities.stream()
.collect(Collectors.collectingAndThen(
Collectors.toMap(
Activity::getLabel,
ac -> new Period(ac.getStartTime(), ac.getEndTime()),
Period::plus),
m -> m.entrySet().stream().collect(Collectors.toMap(
Entry::getKey,
e -> e.getValue().toString(periodFormatter)))));
System.out.println(map); // {Sleeping=00-00-00 15:30:00
关于java - 如何将参数发送到流中的引用方法(java 8)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44097658/