sdg*_*sdh 37 java byte boxing java-8 java-stream
Java的8提供Stream<T>专业化的double,int和long:DoubleStream,IntStream和LongStream分别.但是,我byte在文档中找不到相应的内容.
Java 8是否提供了一个ByteStream类?
Tag*_*eev 39
大多数与字节相关的操作会自动提升为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;
}
Run Code Online (Sandbox Code Playgroud)
请注意,即使我们执行了两个byte变量的添加,它们也会扩展为int,您需要将结果强制转换为byte.在Java字节码最的byte-相关操作(除了阵列加载/存储和转换为字节)与32位整数指示(表示iadd,ixor,if_icmple等等).因此实际上可以将字节作为整数处理IntStream.我们只需要两个额外的操作:
IntStreamfrom byte[]数组(扩大字节到整数)IntStream到byte[]阵列(使用(byte)流延)第一个非常简单,可以像这样实现:
public static IntStream intStream(byte[] array) {
return IntStream.range(0, array.length).map(idx -> array[idx]);
}
Run Code Online (Sandbox Code Playgroud)
因此,您可以将这种静态方法添加到项目中并感到高兴.
将流收集到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();
}
Run Code Online (Sandbox Code Playgroud)
但是,由于同步,它有不必要的开销.特别是处理已知长度的流以减少分配和复制也是很好的.不过现在您可以将Stream API用于byte[]数组:
public static byte[] addStream(byte[] arr, byte addend) {
return toByteArray(intStream(arr).map(b -> b+addend));
}
Run Code Online (Sandbox Code Playgroud)
我的StreamEx库在IntStreamEx类中具有这两个增强标准的操作IntStream,因此您可以像这样使用它:
public static byte[] addStreamEx(byte[] arr, byte addend) {
return IntStreamEx.of(arr).map(b -> b+addend).toByteArray();
}
Run Code Online (Sandbox Code Playgroud)
内部toByteArray()方法使用简单的可调整大小的字节缓冲区,并专门处理流是顺序的并且预先知道目标大小的情况.
Tun*_*aki 33
不,它不存在.实际上,它没有明确地实现,以免混乱使用每个基本类型的大量类的Stream API.
引用一个邮件从布赖恩戈茨在OpenJDK的邮件列表:
简答:不.
对于这些几乎从不使用的表格,每个JDK足迹的价值不再是另外的.如果我们添加了那些,有人会要求short,float或boolean.
换句话说,如果人们坚持认为我们拥有所有原始专业,那么我们就没有原始的专业化.哪个会比现状更糟糕.
| 归档时间: |
|
| 查看次数: |
20477 次 |
| 最近记录: |