“shortcut”来确定reduce()方法中迭代器< intwritable>中的最大元素

f1tvaqid  于 2021-06-04  发布在  Hadoop
关注(0)|答案(1)|浏览(246)

我已经写了下面的内容 reduce() 确定给定年份最高记录温度的方法( map() 的输出给出了一年中记录的温度列表。)

public void reduce(IntWritable year
        , Iterator<IntWritable> temps
        , OutputCollector<IntWritable, IntWritable> output
        , Reporter reporter) 
        throws IOException {
    int maxValue = Integer.MIN_VALUE;
    while(temps.hasNext()) {
        int next = temps.next().get();
        if(next > maxValue) {
            maxValue = next;
        }
    }

    output.collect(year, new IntWritable(maxValue));
}

我很想知道是否有一个“快捷方式”,比如预定义的方法,来消除while循环,直接获得最大值。我在找一些类似c的东西 std::max() . 我在这里搜索找到了这个(convert std::max to java),但是我不知道如何转换我的 Iterator<IntWritable>Collections .
我是一个java初学者,但精通c
,所以我也在努力学习java中使用的各种技术。

nwnhqdif

nwnhqdif1#

不幸的是,没有办法将 Iterator 进入 Collections ,除非您使用其他库,如guava或apache commons collections。以第二个为例,您可以将其转换为 List 然后打电话给 Collection.max 功能。

List<IntWritable> list = IteratorUtils.toList(temps);

如果不想使用外部库,则没有其他选择。您可以使用for each循环稍微减少一点代码,尽管结果没有那么不同:

for(IntWritable intWritable : temps) {
    if(intWritable.get() > maxValue) {
        maxValue = intWritable;
    }
}

相关问题