我有一個帶有以下欄位的類電影
String name;
double duration;
Collection<String> categories;
我的任務是回傳一個Map<String, Double>代表平均持續時間的類別。我必須使用 Java 的 Stream API。
我的想法是String為類別形成條目,List<Double>其中元素是不同的持續時間,然后使用流api方法映射并將其映射到字串和平均值的映射。但我不知道該怎么做。有人可以幫我怎么做嗎?
uj5u.com熱心網友回復:
您可以使用帶有下游收集器的三引數形式Collectors.groupingBy()Collectors.averagingDouble()一次性完成。Java 17 示例(包括Map.Entry用于模擬 2 元素元組或對類):
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}
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/404557.html
標籤:
上一篇:反向字典屬性設定為ids?
