如何使用流 API java 获取具有电影的每个类别的平均持续时间

How to get the average duration for each category having films using stream API java

我有一部 class 具有以下字段的电影

      String name;
      double duration;
      Collection<String> categories;

我的任务是 return 一个 Map<String, Double> 代表类别的平均持续时间。 我必须使用 Java 的 Stream API。

我的想法是形成条目 String 的类别和 List<Double> 其中元素是不同的持续时间,然后使用流 api 方法映射并将其映射到字符串和平均值的映射。但我不知道该怎么做。有人可以帮我怎么做吗?

您可以使用 three-argument form of Collectors.groupingBy() with a downstream Collectors.averagingDouble() 收集器一次性完成。 Java 17 示例(包括使用 Map.Entry 模拟 2 元素元组或对 class):

import java.util.*;
import java.util.stream.*;

public class Demo {
    private record Film(String name, double duration,
                        Collection<String> categories) {}

    public static void main(String[] args) {
        var films = List.of(new Film("The Terminator", 1.783,
                                     List.of("Sci-Fi", "Action")),
                            new Film("Alien", 1.95,
                                     List.of("Sci-Fi", "Horror")));

        Map<String,Double> avgDurations = films.stream()
            // Get a stream of (Category, Duration) pairs
            .flatMap(film ->
                     film.categories().stream()
                     .map(cat -> Map.entry(cat, film.duration())))
            // Group by Category and calculate the average of each
            // group's Durations in a TreeMap
            .collect(Collectors.groupingBy(Map.Entry::getKey,
                                           TreeMap::new,
                                           Collectors.averagingDouble(Map.Entry::getValue)));

        System.out.println(avgDurations);
    }
}

编译后运行,打印出

{Action=1.783, Horror=1.95, Sci-Fi=1.8664999999999998}