Подтвердить что ты не робот

Каков наилучший способ преобразования массива байтов в 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 функционально. (Яркое упущение?)

Есть ли более эффективный способ, который эффективен и не копирует?

4b9b3361

Ответ 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 (плюс обработка исключений) и завершить его, когда вы достигнете конца потока.

Относительно

но ни одна из них не очень функциональна из-за копирования источника

Я не понимаю, почему это не работает.

Также релевантно