在reducer中的for循环中出现编译错误“只能迭代数组或java.lang.Iterable的实例”

在reducer中的for循环中出现编译错误“只能迭代数组或java.lang.Iterable的实例”,java,arrays,hadoop,mapreduce,iterator,Java,Arrays,Hadoop,Mapreduce,Iterator,获取编译错误只能在reducer中for循环的java.lang.Iterable的数组或实例上迭代 public void reduce(Text key, Iterator<IntWritable> values, OutputCollector<Text, IntWritable> Output, Reporter arg3) throws IOException { // TODO Auto-gene

获取编译错误只能在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();
在上面的代码中,对于IntWritable val:values,getting编译错误只能在java.lang.Iterable at的数组或实例上迭代。如何在同一个方法中使用循环?

将Iterable而不是迭代器传递给该方法,或者使用hasNext和next在迭代器的元素上进行迭代:

将Iterable而不是迭代器传递给方法,或者使用hasNext和next对迭代器的元素进行迭代:


迭代器通常指向集合中的单个实例。 因此,对于IntWritable val:值无效


改用Iterable。在函数中传递Iterable

迭代器通常指向集合中的单个实例。 因此,对于IntWritable val:值无效

改用Iterable。在函数中传递Iterable

试试这个

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

    new Iterable<IntWritable>() {

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

    };
试试这个

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

    new Iterable<IntWritable>() {

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

    };