首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Java8中,有一个ByteStream类吗?

在Java8中,有一个ByteStream类吗?
EN

Stack Overflow用户
提问于 2015-09-08 13:54:17
回答 5查看 37.6K关注 0票数 58

Java 8分别为doubleintlong提供了DoubleStreamIntStreamLongStream的专门化。但是,我无法在byte中找到文献资料的等效项。

Java 8提供了一个ByteStream类吗?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2015-09-08 13:57:25

不,它不存在。实际上,它没有显式地实现,这样就不会使Stream与每种原始类型的大量类相混淆。

引用Brian在OpenJDK邮件列表中的OpenJDK

简短回答:不。 对于这些几乎从未使用过的表单,JDK占用的每一个100K+都是不值得的。如果我们加上这些,有人会要求短、浮点或布尔值。 换句话说,如果人们坚持我们拥有所有的原始专业,我们就不会有原始的专门化。会比现状更糟。

票数 50
EN

Stack Overflow用户

发布于 2015-09-09 04:18:34

大多数与字节相关的操作都会自动提升为int。例如,让我们考虑一个简单的方法,它在返回新的byte数组的byte[]数组的每个元素中添加一个byte[]常量(潜在的ByteStream候选元素):

代码语言:javascript
复制
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位整数指令(iaddixorif_icmple等)表示的。因此,实际上,使用IntStream将字节作为it处理是可以的。我们只需要另外做两次手术:

  • IntStream数组创建一个byte[] (将字节扩展到int)
  • 收集IntStreambyte[]数组(使用(byte)强制转换)

第一种方法非常简单,可以这样实现:

代码语言:javascript
复制
public static IntStream intStream(byte[] array) {
    return IntStream.range(0, array.length).map(idx -> array[idx]);
}

因此,您可以将这样的静态方法添加到您的项目中并感到高兴。

将流收集到byte[]数组中要复杂得多。使用标准JDK类,最简单的解决方案是ByteArrayOutputStream

代码语言:javascript
复制
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[]数组:

代码语言:javascript
复制
public static byte[] addStream(byte[] arr, byte addend) {
    return toByteArray(intStream(arr).map(b -> b+addend));
}

我的StreamEx库在增强标准IntStreamIntStreamEx类中有这两个操作,因此您可以这样使用它:

代码语言:javascript
复制
public static byte[] addStreamEx(byte[] arr, byte addend) {
    return IntStreamEx.of(arr).map(b -> b+addend).toByteArray();
}

在内部,toByteArray()方法使用简单的可调整大小的字节缓冲器特别手柄,当流是顺序的并且预先知道目标大小时。

票数 48
EN

Stack Overflow用户

发布于 2021-02-10 16:13:02

使用com.google.common.primitives.Bytes.asList(byte[]).stream()代替。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32459683

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档