使用Java

时间:2017-07-29 21:36:31

标签: java java-stream

我有一个byte []的ArrayList,我想知道是否可以使用来自Java *的流将其转换为byte []。 ArrayList中的所有数组都具有相同的大小。

ArrayList<byte[]> buffer = new ArrayList();

byte[] output = buffer.stream(...)

4 个答案:

答案 0 :(得分:10)

试试这个。

List<byte[]> list = Arrays.asList("abc".getBytes(), "def".getBytes());
byte[] result = list.stream()
    .collect(
        () -> new ByteArrayOutputStream(),
        (b, e) -> {
            try {
                b.write(e);
            } catch (IOException e1) {
                throw new RuntimeException(e1);
            }
        },
        (a, b) -> {}).toByteArray();
System.out.println(new String(result));
// -> abcdef

答案 1 :(得分:2)

flatMap应该是你想要的,理想情况下它应该是这样的:

byte[] output = buffer.stream().flatMap(x -> Arrays.stream(x)).toArray(n -> new byte[n])

但它没有编译。

使用一些辅助方法:

private Byte[] box(final byte[] arr) {
    final Byte[] res = new Byte[arr.length];
    for (int i = 0; i < arr.length; i++) {
        res[i] = arr[i];
    }
    return res;
}
private byte[] unBox(final Byte[] arr) {
    final byte[] res = new byte[arr.length];
    for (int i = 0; i < arr.length; i++) {
        res[i] = arr[i];
    }
    return res;
}

以下内容应该有效(但不是很好或有效):

byte[] output = unBox(buffer.stream().flatMap(x -> Arrays.stream(box(x))).toArray(n -> new Byte[n]));

答案 2 :(得分:2)

您可以使用Guava libraryBytes支持将byte[]转换为List<Byte>并返回途径:

public static List<Byte> asList(byte... backingArray)

public static byte[] toArray(Collection<? extends Number> collection)

另一种选择是简单地将数组逐个迭代并复制到一个大字节[],在我看来,接受答案中的代码更简单,更直接......

public static void main(String[] args) {
    List<byte[]> list = Arrays.asList("abc".getBytes(), "def".getBytes());
    byte[] flattened= flatByteList(list);
    System.out.println(new String(flattened)); // abcdef
}

private static byte[] flatByteList(List<byte[]> list) {
    int byteArrlength = list.get(0).length;
    byte[] result = new byte[list.size() * byteArrlength]; // since all the arrays have the same size
    for (int i = 0; i < list.size(); i++) {
        byte[] arr = list.get(i);
        for (int j = 0; j < byteArrlength; j++) {
            result[i * byteArrlength + j] = arr[j];
        }
    }
    return result;
}

答案 3 :(得分:2)

这是使用番石榴库的可能解决方案:

List<byte[]> list = Arrays.asList("abc".getBytes(), "def".getBytes());
byte[] res = Bytes.toArray(list.stream()
        .map(byteArray -> Bytes.asList(byteArray))
        .flatMap(listArray -> listArray.stream())
        .collect(Collectors.toList()));