
在实际开发中,我们经常需要处理包含多种类型或类别的数据集合。例如,给定一个building(建筑)对象的列表,每个building对象都包含price(价格)、neighborhood(社区)和category(类别)等属性。我们的目标是计算每个category下所有building的平均price,并将结果存储在一个map<category, double>中,其中键是category,值是该类别的平均价格。
为了更好地理解,我们首先定义相关的类结构:
import java.util.Objects;
// 假设Category是一个枚举类型或简单类
class Category {
private String name;
public Category(String name) {
this.name = name;
}
public String getName() {
return name;
}
@Override
public String toString() {
return "Category{" + "name='" + name + '\'' + '}';
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Category category = (Category) o;
return Objects.equals(name, category.name);
}
@Override
public int hashCode() {
return Objects.hash(name);
}
}
class Building {
private int price;
private String neighborhood;
private Category category;
public Building(int price, String neighborhood, Category category) {
this.price = price;
this.neighborhood = neighborhood;
this.category = category;
}
public int getPrice() {
return price;
}
public String getNeighborhood() {
return neighborhood;
}
public Category getCategory() {
return category;
}
@Override
public String toString() {
return "Building{" +
"price=" + price +
", neighborhood='" + neighborhood + '\'' +
", category=" + category +
'}';
}
}如果没有Java Stream API,我们可能需要通过多步迭代来完成这个任务:
这种方法代码量较大,逻辑分散,且容易出错。
Java 8引入的Stream API提供了一种声明式处理数据集合的强大方式。通过结合Collectors.groupingBy和Collectors.averagingDouble,我们可以用一行代码实现上述复杂的数据聚合逻辑。
立即学习“Java免费学习笔记(深入)”;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import java.util.HashMap;
import java.util.ArrayList;
public class BuildingPriceCalculator {
/**
* 计算每个类别的平均建筑价格。
*
* @param buildings 建筑对象列表。
* @return 一个Map,键是Category,值是该类别的平均价格。
*/
public static Map<Category, Double> averagePricePerCategory(List<Building> buildings) {
// 如果输入列表为空,直接返回一个空Map
if (buildings == null || buildings.isEmpty()) {
return new HashMap<>();
}
return buildings.stream() // 将List转换为Stream
.collect(Collectors.groupingBy( // 使用groupingBy进行分组
Building::getCategory, // 根据Building的Category属性进行分组
Collectors.averagingDouble(Building::getPrice) // 对每个分组内的Building,计算其price的平均值
));
}
public static void main(String[] args) {
// 示例数据
Category residential = new Category("Residential");
Category commercial = new Category("Commercial");
Category industrial = new Category("Industrial");
List<Building> buildings = new ArrayList<>();
buildings.add(new Building(100000, "Downtown", residential));
buildings.add(new Building(150000, "Suburb", residential));
buildings.add(new Building(200000, "City Center", commercial));
buildings.add(new Building(50000, "Outskirts", industrial));
buildings.add(new Building(120000, "Downtown", residential));
buildings.add(new Building(250000, "Financial District", commercial));
Map<Category, Double> averagePrices = averagePricePerCategory(buildings);
System.out.println("各类别平均价格:");
averagePrices.forEach((category, avgPrice) ->
System.out.println(category.getName() + ": " + String.format("%.2f", avgPrice))
);
// 测试空列表情况
List<Building> emptyBuildings = new ArrayList<>();
Map<Category, Double> emptyAveragePrices = averagePricePerCategory(emptyBuildings);
System.out.println("\n空列表的平均价格结果: " + emptyAveragePrices); // 预期输出 {}
}
}最终,collect方法会返回一个Map<Category, Double>,其中键是Category对象,值是该类别建筑的平均价格。
通过本教程,我们了解了如何利用Java Stream API中的groupingBy和averagingDouble收集器,以一种简洁、高效且声明式的方式,从对象列表中聚合数据并计算按类别分组的平均值。掌握Stream API是现代Java开发中不可或缺的技能,它能显著提升代码质量和开发效率。
以上就是使用Java Stream API高效聚合数据:按类别计算平均价格的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号