2017-07-29 65 views
2

我有一個byte []的ArrayList,我想知道是否有可能使用來自Java *的流將其轉換爲byte []。 ArrayList中的所有數組具有相同的大小。在Java中使用流的byte []到byte []的ArrayList

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

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

concat所有的字節[]? – azro

+0

是的。我想要在一個唯一的字節數組ArrayList中的所有字節。 – daniboy000

+2

相關:[在Java 8中,是否有ByteStream類?](// stackoverflow.com/q/32459683) – 4castle

回答

9

試試這個。

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 
+0

這是隻適用於API級別24和以上? –

+1

@UmairM我不知道「API級別24」。但它需要Java 8或更高版本。 – saka1029

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])); 
+0

不能編譯。 –

+0

'toArray'不能用於輸出基本數組(泛型不允許)。這仍然不會編譯。 – 4castle

+0

已更新爲編譯版本。 (雖然我承認這不是很好。) –

2

您可以使用Guava library,它具有Bytes支持轉換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; 
}