Java Stream平均值的最大值

时间:2019-01-10 11:43:26

标签: java java-8 java-stream average minmax

我必须获取最高平均温度的国家/地区名称。

我已经使用以下方法来获取平均温度

 this.getTemperatures()
                .stream()
                .collect(Collectors.groupingBy(Temperature::getCountry,
                        Collectors.averagingDouble(Temperature::getAverageTemperature)))

如何从此平均温度列表中获取最大或最小平均国家/地区名称?

4 个答案:

答案 0 :(得分:4)

我不太喜欢这样做,因为重复了很多代码,但是可以正常工作。在不使代码更糟的情况下,我无法找到避免重复的方法。

这还会对所有地图条目进行两次迭代,但是鉴于只有195个国家/地区,因此我们所讨论的最多是195次额外的迭代(如果您有每个指标的测量结果),那么对于一个中央处理器。

String max = countryToAvgTemp.entrySet().stream()      //stream all entries
    .max(Map.Entry.comparingByValue())                 //get the max by comparing entry value
    .map(Map.Entry::getKey)                            //grab the key   
    .orElseThrow(() -> new RuntimeException("No max")); //e.g. if the list is empty

String min = countryToAvgTemp.entrySet().stream()
    .min(Map.Entry.comparingByValue())
    .map(Map.Entry::getKey)
    .orElseThrow(() -> new RuntimeException("No min"));

如果只想迭代一次,则可以编写自己的收集器,该收集器返回类似MinMax<String>的内容。我写了一个,但是代码不是很好。最好保持简单。

答案 1 :(得分:1)

使用

Collections.min(temperatureMap.entrySet(), Comparator.comparingInt(Map.Entry::getValue)).getValue()

Collections.max(temperatureMap.entrySet(),  Comparator.comparingInt(Map.Entry::getValue)).getValue()

答案 2 :(得分:1)

如果要获取最大或最小平均国家名称,可以对温度列表进行排序,然后获取第一个和最后一个元素。但是您的工作不需要排序列表,这不是一个好方法,@ Michael的方法是对你很好。

       List<Temperature> temperatures = Arrays.asList(
                new Temperature("a",10),
                new Temperature("b",11),
                new Temperature("c",12),
                new Temperature("d",13),
                new Temperature("e",14),
                new Temperature("f",15),
                new Temperature("g",16),
                new Temperature("h",17));

        temperatures = temperatures.stream().sorted(new Comparator<Temperature>() {
            @Override
            public int compare(Temperature o1, Temperature o2) {
                return (int) (o1.getAverageTemperature() - o2.getAverageTemperature());
            }
        }).collect(Collectors.toList());

        String min = temperatures.get(0).getCountry();
        String max = temperatures.get(temperatures.size()-1).getCountry();

答案 3 :(得分:0)

您可以尝试DoubleSummaryStatistics:

this.getTemperatures()
            .stream()
            .collect(Collectors.groupingBy(Temperature::getCountry,
                    Collectors.summarizingDouble(Temperature::getAverageTemperature)));

这将返回一张地图:

Map<Country, DoubleSummaryStatistics>

因此,使用DoubleSummaryStatistics,您可以获取每个国家/地区的计数,总和,最小,最大,平均值