我有一个byte []的ArrayList,我想知道是否可以使用来自Java *的流将其转换为byte []。 ArrayList中的所有数组都具有相同的大小。
ArrayList<byte[]> buffer = new ArrayList();
byte[] output = buffer.stream(...)
答案 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 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;
}
答案 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()));