Java 8分别为double、int和long提供了DoubleStream、IntStream和LongStream的专门化。但是,我无法在byte中找到文献资料的等效项。
Java 8提供了一个ByteStream类吗?
发布于 2015-09-08 13:57:25
不,它不存在。实际上,它没有显式地实现,这样就不会使Stream与每种原始类型的大量类相混淆。
引用Brian在OpenJDK邮件列表中的OpenJDK
简短回答:不。 对于这些几乎从未使用过的表单,JDK占用的每一个100K+都是不值得的。如果我们加上这些,有人会要求短、浮点或布尔值。 换句话说,如果人们坚持我们拥有所有的原始专业,我们就不会有原始的专门化。会比现状更糟。
发布于 2015-09-09 04:18:34
大多数与字节相关的操作都会自动提升为int。例如,让我们考虑一个简单的方法,它在返回新的byte数组的byte[]数组的每个元素中添加一个byte[]常量(潜在的ByteStream候选元素):
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;
}看,即使我们执行两个byte变量的加法,它们被扩展到int,您需要将结果转换回byte。在Java字节码中,大多数byte-related操作(除了数组加载/存储和字节转换)都是用32位整数指令(iadd、ixor、if_icmple等)表示的。因此,实际上,使用IntStream将字节作为it处理是可以的。我们只需要另外做两次手术:
IntStream数组创建一个byte[] (将字节扩展到int)IntStream到byte[]数组(使用(byte)强制转换)第一种方法非常简单,可以这样实现:
public static IntStream intStream(byte[] array) {
return IntStream.range(0, array.length).map(idx -> array[idx]);
}因此,您可以将这样的静态方法添加到您的项目中并感到高兴。
将流收集到byte[]数组中要复杂得多。使用标准JDK类,最简单的解决方案是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();
}但是,由于同步,它有不必要的开销。另外,最好是专门处理已知长度的流,以减少分配和复制。不过,现在您可以将Stream用于byte[]数组:
public static byte[] addStream(byte[] arr, byte addend) {
return toByteArray(intStream(arr).map(b -> b+addend));
}我的StreamEx库在增强标准IntStream的IntStreamEx类中有这两个操作,因此您可以这样使用它:
public static byte[] addStreamEx(byte[] arr, byte addend) {
return IntStreamEx.of(arr).map(b -> b+addend).toByteArray();
}发布于 2021-02-10 16:13:02
使用com.google.common.primitives.Bytes.asList(byte[]).stream()代替。
https://stackoverflow.com/questions/32459683
复制相似问题