[英]How to get the object that has the maximum value for multiple attributes using a stream?
[英]Java Get maximum value of Set with attributes using a mapper
我有个问题。 我正在尝试创建一个 function ,它返回Set<Measurement>
中给定属性的最大值。 这是我现在拥有的 function:
public Map<Integer,Double> annualMaximumTrend(Function<Measurement,Double> mapper) {
Map<Integer, Double> maximumValue = new LinkedHashMap<>();
int startYear = determineStartYear();
for (int year = startYear; year <= LocalDate.now().getYear(); year++) {
LocalDate startDate = LocalDate.of(year - 1, 12, 31);
LocalDate endDate = LocalDate.of(year + 1, 1, 1);
Set<Measurement> stationAverages = new HashSet<>();
for (Station station : stations.values()) {
stationAverages.addAll(station
.getMeasurements()
.stream()
.filter(m -> m.getDate().isAfter(startDate) &&
m.getDate().isBefore(endDate) &&
!Double.isNaN(mapper.apply(m))
).collect(Collectors.toSet()));
}
OptionalDouble maximum = stationAverages.stream().mapToDouble(Measurement::getMaxTemperature).max();
if (maximum.isPresent())
maximumValue.put(year, maximum.getAsDouble());
}
return maximumValue;
}
但是我需要确定maximum
差异,因为我需要在某处使用mapper.apply()
而不是Measurement::getMaxTemperature
,因为该映射器决定了我想要哪个属性的最大值。 我需要如何使用映射器?
您可以使用 lambda:
stationAverages.stream().mapToDouble(m -> mapper.apply(m)).max();
如果mapper
是ToDoubleFunction<Measurement>
你可以直接将它传递给mapToDouble()
。 因为它不是你需要在另一个函数/lambda 中调用它,例如mapToDouble(m -> mapper.apply(m))
。
或者,使用map(mapper).max(Comparator.naturalOrder())
来获得Optional<Double>
。
但是,请注意,您已经有 2 个内部循环,其中一个不是必需的:
您可以在一个 go 中完成所有操作:
Optional<Double> max = stations.values().stream()
.flatMap(station -> station
.getMeasurements()
.stream()
.filter(m -> m.getDate().isAfter(startDate) &&
m.getDate().isBefore(endDate)
)
.map(mapper)
.filter(v -> !Double.isNaN(v))
)
.max(Comparator.naturalOrder());
实际上,您甚至可以在一个 go 中完成所有操作。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.