繁体   English   中英

Java 使用映射器获取带有属性的 Set 的最大值

[英]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();

如果mapperToDoubleFunction<Measurement>你可以直接将它传递给mapToDouble() 因为它不是你需要在另一个函数/lambda 中调用它,例如mapToDouble(m -> mapper.apply(m))

或者,使用map(mapper).max(Comparator.naturalOrder())来获得Optional<Double>

但是,请注意,您已经有 2 个内部循环,其中一个不是必需的:

  1. 一个循环来构建集合
  2. 使用 stream 的一个(隐藏)循环

您可以在一个 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM