Ich habe eine Java-Klasse der folgenden Form:
%Vor%Ich würde gerne in der Lage sein, über die privaten Daten mit einem Iterator wie folgt extern zu iterieren:
for(byte b : Example) { ;/* do stuff */ }
Ich habe versucht, eine private Iterator-Klasse zu implementieren, aber ich stieß auf Probleme:
%Vor%Wie würde ich einen externen Iterator für primitive Typen (keine Generika) implementieren? Ist das in Java möglich?
Java 8 hat primitive Iteratoren eingeführt, die Sie vermeiden können Boxing / Unboxing während der Iteration über int, long und double collections.
Sie können ein eigenes PrimitiveIterator
von byte
mit typesafe anlegen, indem Sie das generische PrimitiveIterator<Byte,ByteConsumer>
implementieren. ByteConsumer
soll ebenfalls implementiert werden. Beide sind ziemlich einfach.
Warum gibt es keine PrimitiveIterator.ofByte
in jdk? Wahrscheinlich wegen der Maschinenwortgröße, die normalerweise nicht kleiner als int ist. Oder Byte-Iteratoren werden besser von Streams und so gemacht.
Ein Iterator kann keine Werte eines primitiven Typs liefern. Es kann jedoch Werte des Wrappertyps Byte
ergeben. Solche Werte können automatisch aus der Box entfernt werden in byte
(solange dies nicht der Fall ist) null
).
Dann können Sie es wie folgt verwenden:
%Vor%Sie können keine Generika mit Primitiven verwenden, da die Generika eine Klasse für den Typ benötigen.
Was Sie tun können, ist iterieren über die Wrapper-Typen (Integer, Byte, Boolean, etc) ...
Implementieren Sie Iterable und geben Sie ein Byte-Objekt anstelle von a zurück Byte-Primitiv:
%Vor%Wenn Sie Iterable anstelle von Iterator implementieren, können Sie die Objektelemente mithilfe der For-Each-Schleife direkt Schleife machen.
Wenn Ihr Iterator java.util.Iterator implementieren soll, muss next () Byte
zurückgeben %Vor%remove kann auch implementiert werden. Wenn Sie es nicht benötigen, implementieren Sie Iterator, dann können wir next () ändern, um Byte
zurückzugeben %Vor%Tags und Links java iterator private-members primitive autoboxing