【问题标题】:How can I make an IntStream from a byte array?如何从字节数组制作 IntStream?
【发布时间】:2014-11-28 02:16:29
【问题描述】:

我已经知道只有IntStreamLongStream。如何从字节数组中创建IntStream

目前我正打算这样做。

static int[] bytesToInts(final byte[] bytes) {
    final int[] ints = new int[bytes.length];
    for (int i = 0; i < ints.length; i++) {
        ints[i] = bytes[i] & 0xFF;
    }
    return ints;
}

static IntStream bytesToIntStream(final byte[] bytes) {
    return IntStream.of(bytesToInt(bytes));
}

有没有更简单或更快的方法来做到这一点?

【问题讨论】:

标签: lambda java-8 java-stream


【解决方案1】:

Radiodef 答案的变体:

static IntStream bytesToIntStream(byte[] bytes) {
    return IntStream.range(0, bytes.length)
        .map(i -> bytes[i] & 0xFF)
    ;
}

也更容易保证并行化。

【讨论】:

    【解决方案2】:

    你可以这样做

    static IntStream bytesToIntStream(byte[] bytes) {
        AtomicInteger i = new AtomicInteger();
        return IntStream
            .generate(() -> bytes[i.getAndIncrement()] & 0xFF)
            .limit(bytes.length);
    }
    

    但它不是很漂亮。 (不过还不错:AtomicInteger 的使用允许流并行运行。)

    【讨论】:

    • 实际上,在这里使用AtomicInteger 并不会为并行处理带来任何好处,因为Stream 不知道您正在使用它。因此它将假定没有并行能力。对于 Supplier 而言,这并不重要,其中每个项目的创建都取决于前一个项目的结果状态……
    • @Holger 你不能在直播中打电话给parallel()吗?还是只是提示?
    • 您可以在流上调用parallel,它会尽可能并行执行操作,但Supplier不会被同时查询,因此会成为瓶颈。但即使它被同时调用,AtomicInteger 也可能成为一个瓶颈,因为它会序列化所有更新。这与根本不需要并发更新的公认答案有很大不同。
    【解决方案3】:

    一行代码:

    import com.google.common.primitives.Bytes;
    IntStream in = Bytes.asList(bytes).stream().mapToInt(i-> i & 0xFF);
    

    【讨论】:

      猜你喜欢
      • 2020-06-20
      • 1970-01-01
      • 1970-01-01
      • 2013-04-29
      • 1970-01-01
      • 2012-04-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多