如何使用流 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}
我有一部 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}