Каков наилучший способ преобразования массива байтов в IntStream?
Java 8 имеет типы java.util.stream.Stream и java.util.stream.IntStream. java.util.Arrays имеет метод
IntStream is = Arrays.stream(int[])
но нет такого метода, чтобы сделать IntStream из байта [], short [] или char [], расширяя каждый элемент до int. Есть ли идиоматический/предпочтительный способ создания IntStream из байта [], поэтому я могу работать с байт-массивами в функциональном режиме?
Я могу, конечно, тривиально преобразовать байт [] в int [] вручную и использовать Arrays.stream(int []) или использовать IntStream.Builder:
public static IntStream stream(byte[] bytes) {
IntStream.Builder isb = IntStream.builder();
for (byte b: bytes)
isb.add((int) b);
return isb.build();
}
но ни одна из них не очень функциональна из-за копирования источника.
Также нет простого способа конвертировать InputStream (или в этом случае ByteArrayInputStream) в IntStream, что было бы очень полезно для обработки InputStream функционально. (Яркое упущение?)
Есть ли более эффективный способ, который эффективен и не копирует?
Ответы
Ответ 1
byte[] bytes = {2, 6, -2, 1, 7};
IntStream is = IntStream.range(0, bytes.length).map(i -> bytes[i]);
ByteArrayInputStream inputStream = new ByteArrayInputStream(bytes);
IntStream is2 = IntStream.generate(inputStream::read).limit(inputStream.available());
Ответ 2
public static IntStream stream(byte[] bytes) {
ByteBuffer buffer = ByteBuffer.wrap(bytes);
return IntStream.generate(buffer::get).limit(buffer.remaining());
}
(Это можно легко изменить, чтобы взять int
из ByteBuffer
, т.е. 4 байта в int
.)
Для InputStream
, если вы хотите использовать его с нетерпением, просто прочитайте его в byte[]
и используйте приведенное выше. Если вы хотите использовать его лениво, вы можете создать бесконечный InputStream
с помощью InputStream::read
как Consumer
(плюс обработка исключений) и завершить его, когда вы достигнете конца потока.
Относительно
но ни одна из них не очень функциональна из-за копирования источника
Я не понимаю, почему это не работает.
Также релевантно