使用 Java 8 的 lambda 表达式,将 List<Byte> 转换为原始字节 [],无需外部库 [重复]
Posted
技术标签:
【中文标题】使用 Java 8 的 lambda 表达式,将 List<Byte> 转换为原始字节 [],无需外部库 [重复]【英文标题】:Using lambda expression of Java 8, convert List<Byte> to primitive byte[], without external libraries [duplicate] 【发布时间】:2020-02-10 02:43:31 【问题描述】:请先阅读!我的问题是 Java 8,
显然,在出现这些问题时,java 8 还不存在。
How to convert an ArrayList containing Integers to primitive int array? 10 年后的今天! Convert ArrayList<Byte> into a byte[]今天8年!
我有这个代码:
List<Byte> listByte = new ArrayList<>();
// fill the List with Byte Wrapper...
那些会导致错误:
// 1. option
byte[] arrayByte = listByte.stream().map(B -> B.byteValue()).toArray();
// 2. option
byte[] arrayByte = listByte.toArray(new byte[0]);
是否有其他方法代替循环方法?
【问题讨论】:
Re: 其他线程“太老了”。关于int[]
的那篇文章有Java 8 解决方案的答案。对于byte[]
,Java 8 中没有什么新东西,原始流并未有意添加到所有类型中,请参阅***.com/q/32459683/14955 无论哪种方式,链接的答案仍然有效。
@Thilo 您在其他问题中找到答案了吗?
@ChepeQuestn ***.com/q/6860055/14955 上的所有答案都在这里工作
用户的问题是:有没有别的方法代替for循环的方法?
@ChepeQuestn 另一个链接问题中的answer by Tagir 确实提供了一种方法(toByteArray
),它与在此处使用 lambda 的要求相结合。除此之外,如果可以作为问题的答案,也可以使用 lambda 作为byte[] arrayBytes = new byte[listByte.size()]; IntStream.range(0, listByte.size()).forEach(i -> arrayBytes[i] = listByte.get(i));
编写正常的 for 循环。
【参考方案1】:
您可以尝试这样做:
listByte.stream().collect(ByteArrayOutputStream::new, (baos, i) -> baos.write((byte) i),
(baos1, baos2) -> baos1.write(baos2.toByteArray(), 0, baos2.size()))
.toByteArray()
【讨论】:
组合器仅用于并行流,很难推断在这种情况下它是如何工作的。最好使用不支持组合的 collect 版本。 是的,我同意这不是最容易处理的事情,谢谢以上是关于使用 Java 8 的 lambda 表达式,将 List<Byte> 转换为原始字节 [],无需外部库 [重复]的主要内容,如果未能解决你的问题,请参考以下文章