使用 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 -&gt; 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> 转换为原始字节 [],无需外部库 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

使用 Java 8 的 lambda 表达式,将 List<Byte> 转换为原始字节 [],无需外部库 [重复]

Java 8——Lambda表达式

使用 Java 8 Lambda 创建 ArrayList

Lambda 表达式 in java 8

Java1.8新特性

Java 8 Lambda 表达式