Die meisten bytebezogenen Operationen werden automatisch zu int hochgestuft. Zum Beispiel wollen wir die einfache Methode betrachten, die eine byte
Konstante zu jedem Element der byte[]
Array zurückkehr neue (potentieller Kandidat für ByteStream
) byte[]
Array ergänzt:
public static byte[] add(byte[] arr, byte addend) {
byte[] result = new byte[arr.length];
int i=0;
for(byte b : arr) {
result[i++] = (byte) (b+addend);
}
return result;
}
See, obwohl wir eine Addition von zwei byte
Variablen durchführen, Sie werden auf int
erweitert und Sie müssen das Ergebnis zurück auf byte
werfen. In Java-Bytecode werden die meisten byte
-bezogenen Operationen (außer Array laden/speichern und in Byte umwandeln) mit 32-Bit-Integer-Anweisungen (iadd
, , if_icmple
usw.) ausgedrückt. Somit ist es praktisch, Bytes mit IntStream
als Ints zu verarbeiten. Wir müssen nur zwei zusätzliche Operationen:
- Einen
IntStream
von byte[]
Array (Erweiterung Bytes Ints)
- Collect einen
IntStream
zu byte[]
Array (mit (byte)
Guss)
Die erste ist wirklich einfach und kann wie folgt implementiert werden:
public static IntStream intStream(byte[] array) {
return IntStream.range(0, array.length).map(idx -> array[idx]);
}
S o Sie können Ihrem Projekt eine solche statische Methode hinzufügen und glücklich sein.
Sammeln der Strom in byte[]
Array ist schwieriger.Standard JDK-Klassen die einfachste Lösung zu verwenden ist ByteArrayOutputStream
:
public static byte[] toByteArray(IntStream stream) {
return stream.collect(ByteArrayOutputStream::new, (baos, i) -> baos.write((byte) i),
(baos1, baos2) -> baos1.write(baos2.toByteArray(), 0, baos2.size()))
.toByteArray();
}
aber es unnötigen Aufwand aufgrund Synchronisation hat. Es wäre auch schön, die Ströme bekannter Länge speziell zu verarbeiten, um die Zuweisungen und das Kopieren zu reduzieren. Trotzdem jetzt können Sie die Stream-API für byte[]
Arrays verwenden:
public static byte[] addStream(byte[] arr, byte addend) {
return toByteArray(intStream(arr).map(b -> b+addend));
}
Meine StreamEx Bibliothek beide dieser Operationen in der IntStreamEx
Klasse hat die Standard IntStream
verbessert, so dass Sie es wie folgt verwenden können:
public static byte[] addStreamEx(byte[] arr, byte addend) {
return IntStreamEx.of(arr).map(b -> b+addend).toByteArray();
}
Intern toByteArray()
Methode verwendet einfach resizable byte buffer und specially handles der Fall, wenn der Strom sequenziell und Zielgröße im Voraus bekannt ist.
http://stackoverflow.com/questions/22918847/why-are-new-java-util-arrays-methods-in-java-8-not-overloaded-for-all-the-primit – assylias