java - 如何将参数发送到流中的引用方法(java 8)?

标签 java lambda java-8 java-stream jodatime

我有一个 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/

相关文章:

java - 查找流交集是否为非空

java - 无法在 Android Studio 中创建类文件

java - JSF2 中的 AjaxBehaviorEvent 与 ActionEvent

java - 使用搜索 API 搜索 Google 时遇到问题

c# - 如何在 EF Core 2 中为 .ThenInclude 编写 Repository 方法

c# Lambda, LINQ ....改进这个方法

java - lambda 表达式如何映射到函数式接口(interface)?

java - mockito:如何在 java 8 中匹配可变参数?

java - 缓存的 Optional<Boolean> 值

java - 编译失败子包不存在