List<SfProjectMassifInfo> massifInfos
Set<String> targetYsdls = new HashSet<>(Arrays.asList("旱地", "水浇地"));
Map<String, Double> averageDbByYsdl = massifInfos.stream()
.filter(info -> isValidYsdl(info.getYsdl(), targetYsdls))
.filter(info -> isValidDb(info.getDb()))
.collect(Collectors.groupingBy(
SfProjectMassifInfo::getYsdl,
Collectors.averagingDouble(info ->
parseDoubleOrDefault(info.getDb().trim(), 0.0)
)
));
sfProjectBaseInfo.setDryLandLevel(BigDecimal.valueOf(averageDbByYsdl.get("旱地")));
private static boolean isValidYsdl(String ysdl, Set<String> targetYsdls) {
return ysdl != null && !ysdl.trim().isEmpty() && targetYsdls.contains(ysdl.trim());
}
private static boolean isValidDb(String db) {
try {
if (db == null || db.trim().isEmpty()) {
return false;
}
Double.parseDouble(db.trim());
return true;
} catch (NumberFormatException e) {
return false;
}
}
private static double parseDoubleOrDefault(String value, double defaultValue) {
try {
return Double.parseDouble(value);
} catch (NumberFormatException e) {
return defaultValue;
}
}