java - 如何使用 Java 8 Stream 映射和收集原始返回类型

标签 java arrays java-8 byte java-stream

我是 Java 8 流的新手,我想知道是否有办法对返回 byte 并接受 int 的方法执行 forEach/map 调用 作为参数。

例子:

public class Test {
   private byte[] byteArray; // example of byte array

   public byte getByte(int index) {
      return this.byteArray[index];
   }

   public byte[] getBytes(int... indexes) {
      return Stream.of(indexes)
             .map(this::getByte) // should return byte
             .collect(byte[]::new); // should return byte[]
   }
}

您可能猜到了,getBytes 方法不起作用。 "int[] cannot be converted to int"可能某处缺少 foreach,但个人无法弄清楚。

但是,这是有效的老式方法,我想将其重写为 Stream。

byte[] byteArray = new byte[indexes.length];
for ( int i = 0; i < byteArray.length; i++ ) {
   byteArray[i] = this.getByte( indexes[i] );
}
return byteArray;

最佳答案

您可以编写自己的 Collector 并使用 ByteArrayOutputStream 构建您的 byte[]:

final class MyCollectors {

  private MyCollectors() {}

  public static Collector<Byte, ?, byte[]> toByteArray() {
    return Collector.of(ByteArrayOutputStream::new, ByteArrayOutputStream::write, (baos1, baos2) -> {
      try {
        baos2.writeTo(baos1);
        return baos1;
      } catch (IOException e) {
        throw new UncheckedIOException(e);
      }
    }, ByteArrayOutputStream::toByteArray);
  }
}

并使用它:

public byte[] getBytes(int... indexes) {
  return IntStream.of(indexes).mapToObj(this::getByte).collect(MyCollectors.toByteArray());
}

关于java - 如何使用 Java 8 Stream 映射和收集原始返回类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44708532/

相关文章:

java - 将对象添加到对象数组中

java - 重复 Stream allMatch() 直到 true

java - 在 android 和 ios 的 flutter 应用程序中应用深度链接

java - 通过 https "No X509TrustManager implementation available"失去与网络服务的连接

java - Spring JPA 多对多持久性问题

Android - 压缩图像的位图数组

javascript - 将多个数组的每一项平均到一个数组中

Java:使用 lambda 向文件添加行号的优雅方式

java - 如何在 Java 8 流 forEach 中使用 if-else 逻辑

java - Android,按钮根本不起作用