I have a Java class of the following form:
class Example {
private byte[][] data;
public Example(int s) { data = new byte[s][s]; }
public byte getter(int x, int y) { return byte[x][y]; }
public void setter(int x, int y, byte z) { byte[x][y] = z; }
}
I would like to be able to externally iterate over the private data using an iterator like so:
for(byte b : Example) { ;/* do stuff */ }
I tried to implement a private Iterator class but I ran into problems:
private class ExampleIterator implements Iterator {
private int curr_x;
private int curr_y;
public ExampleIterator() { curr_x=0; curr_y=-1; }
public boolean hasNext() {
return curr_x != field.length-1
&& curr_y != field.length-1; //is not the last cell?
}
public byte next() { // <-- Error is here:
// Wants to change return type to Object
// Won't compile!
if(curr_y=field.length) { ++curr_x; curr_y=0; }
return field[curr_x][curr_y];
}
public void remove() { ; } //does nothing
}
How would I implement an external iterator for primitive types (not generics)? Is this possible in Java?
Java 8 introduced primitive iterators, that allow you to avoid boxing/unboxing during iteration over int, long and double collections.
You can create you own PrimitiveIterator
of byte
with typesafely implementing generic PrimitiveIterator<Byte,ByteConsumer>
. ByteConsumer
is also to be implemented. Both are pretty straightforward.
Why is there no PrimitiveIterator.ofByte
in jdk? Probably because of machine word size, that is usually not smaller than int. Or byte iterators are better done by streams and such.