Java Iterator für primitive Typen

8

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?

    
recursion.ninja 03.04.2013, 15:11
quelle

5 Antworten

5

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.

    
Oroboros102 28.06.2015, 16:18
quelle
8

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 ).

%Vor%

Dann können Sie es wie folgt verwenden:

%Vor%     
NPE 03.04.2013 15:13
quelle
1

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) ...

    
Svend Hansen 03.04.2013 15:15
quelle
0

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.

    
Eyal Schneider 03.04.2013 15:14
quelle
0

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%     
Evgeniy Dorofeev 03.04.2013 15:19
quelle