在reducer的for循环中,获取编译错误“只能迭代一个数组或java.lang.iterable的示例”

pgx2nnw8  于 2021-06-02  发布在  Hadoop
关注(0)|答案(3)|浏览(348)

在reducer中的for循环中,获取编译错误“只能迭代一个数组或java.lang.iterable的示例”。

public void reduce(Text key, Iterator<IntWritable> values,
            OutputCollector<Text, IntWritable> Output, Reporter arg3)
            throws IOException {
        // TODO Auto-generated method stub

        int sum = 0;
         for (IntWritable val : values) {
           sum += val.get();

在上面的代码中,获取编译错误“只能迭代java.lang.iterable的数组或示例” "for (IntWritable val : values)" . 如何使用相同的循环?

pw136qt2

pw136qt21#

试试这个。

for (IntWritable val : (Iterable<IntWritable>)() -> values) {
        sum += val.get();
        ....
``` `(Iterable<IntWritable>)() -> values` 相当于

new Iterable() {

    @Override
    public Iterator<IntWritable> iterator() {
        return values;
    }

};
jrcvhitl

jrcvhitl2#

要么通过 Iterable<IntWritable> 而不是 Iterator<IntWritable> 方法,或使用 hasNext() 以及 next() 迭代 Iterator :

while (values.hasNext()) {
    IntWritable val = values.next();
    ...
}
bvjveswy

bvjveswy3#

迭代器通常指向集合中的单个示例。所以呢 for (IntWritable val : values) 无效。
使用 Iterable 相反。通过 Iterable<IntWritable> 在你的职责范围内。

相关问题