在Java中,将List<char[]>转换/展平为char[]的简单方法是什么?

我知道我可以通过迭代List和使用System.arraycopy来实现这一点,但我想知道是否有一种更简单的方法可以使用Java 8流来实现这一点?

可能是这样的,但不必将基本体char框到Character框:

List<char[]> listOfCharArrays = ...

Character[] charArray =
    Stream.of(listOfCharArrays )
        .flatMap(List::stream)
        .toArray(Character[]::new);

推荐答案

我只能想到一件事,那就是用CharBuffer.出于效率考虑,我总是先计算出正确的大小,然后再进行复制.任何执行多个拷贝和/或字符串处理的解决方案都将效率低下.

当然,我不能保证它不会在CharBuffer#put方法中的某个地方使用System.arrayCopy.我强烈期望它在内部使用System.arrayCopy或类似的代码.这可能适用于这里提供的大多数解决方案.

CharBuffer fullBuffer = CharBuffer.allocate(listOfCharArrays.stream().mapToInt(array -> array.length).sum());
listOfCharArrays.forEach(fullBuffer::put);
char[] asCharArray = fullBuffer.array();

如果可以估计最大大小,当然可以通过使用足够大的缓冲区来避免第一次大小计算,但这需要另一份数据副本;100 simply returns the backing array,这意味着数据is copied only once.

请注意,如果要使用面向对象代码,也可以直接使用CharBuffer.请注意,您需要确保在写入后将其设置为flip,并且CharBuffer是可变的(您可以使用duplicateasReadOnly方法传递副本).

Buffer和Java NIO类稍微有点难理解,但一旦理解了,您就会从中获得很大的好处,例如在CharEncoder中使用它们.

Java相关问答推荐

是否可以从@ TrustMapping中删除特定方法的基路径?

当我用OkHttpClient重写shouldInterceptRequest来发布数据时,Android WebView正在以纯HTML加载URL内容

Apache POI:使用反射获取zoom 级别

S的字符串表示是双重精确的吗?

确定Java中Math.Ranb()输出的上限

try 创建一个对象,使用它,然后使用一条语句将其存储为列表

呈现文本和四舍五入矩形时出现的JavaFX窗格白色瑕疵

如何使用带有谓词参数的方法,而不使用lambda表达式

如何在Microronaut中将 map 读取为 map

在JDK 1.8源代码中,为什么使用A-B 0来确定哪个更大,而不是A B?

如何在代码中将行呈现在矩形前面?

在添加AdMob时无法为Google Play构建应用程序包:JVM垃圾收集器崩溃和JVM内存耗尽

Java堆中的许多java.time.ZoneRegion实例.ZoneId实例不应该被缓存吗?

Java 11 HttpCookie.parse在解析包含JSON的Cookie时引发IlLegalArgumentException

如何在列表(链表)中插入一个新 node (作为prelast)

如何在Struts2中使用操作类中的结果注释重定向到不同的命名空间

Bash数组的单引号元素并使用空格连接

Java中的一个错误';s stdlib SocksSocketImpl?

using case default on switch语句返回;预览特征切换中的模式匹配仅在源级别20及以上的情况下可用;

具有 DayOfWeek 列表的 JPA 实体