java - 如何使用 lambda 表达式将 Iterable 拆分为 block

标签 java lambda apache-commons iterable sublist

我有 Iterable<CSVRecord> = CSVFormat.RFC4180.withFirstRecordAsHeader().parse(in) ( Apache 共享) 记录> 10.000.000.000 行。以前我有带有计数器的 for 循环,在每 x 行之后我正在处理数据。现在我尝试使用 Java 8 lambda 表达式来实现类似的效果。

到目前为止,我想出了这个,但它耗尽了内存,因为我无法找到如何在 subList 中分割它的正确方法。

  Iterable<List<?>> params = new ArrayList<>(StreamSupport
                .stream(records.spliterator(), true)
                .map(r -> Arrays.asList(
                        r.get("name"),
                        r.get("surname"),
                        r.get("something"),
                ))
                .collect(Collectors.toList()).subList(0, 20000));

最后的子列表不起作用:(

我只需要一些如何拆分的概念证明 Iterable - 例如正确的地方放置subList

最佳答案

我不确定您是否可以使用单个 lambda 表达式来完成此操作,但您可以使用 .skip().limit():

int maxSize = 20000;
int currentOffset = 0; // Increment by maxSize each iteration    
Iterable<List<?>> params = new ArrayList<>(StreamSupport
                            .stream(records.spliterator(), true)
                            .skip(currentOffset)
                            .limit(maxSize)
                            .map(r -> Arrays.asList(
                                    r.get("name"),
                                    r.get("surname"),
                                    r.get("something"),
                            ))
                            .collect(Collectors.toList())

关于java - 如何使用 lambda 表达式将 Iterable 拆分为 block ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45638533/

相关文章:

java - 为什么编译器不能推断 Stream.of 的内联 lambda 参数的类型?

c++ - lambda 的参数和返回值的类型转换规则是什么?

java - 使用 Apache Commons CLI 的互斥选项

java - 如何使一个简单的函数通过线程运行

c# - 为什么我不能将 Concat 或 Union 结果合并到一个空列表中?

java - 印度语言的拼音搜索

java - 使用 Validate.notNull() 时是否可以更改或包装异常

java - 为什么 eclipse 不警告使用较新 java 版本中的类?

java - 非目标绑定(bind)与 `toInstance()` 绑定(bind)

java - 打开的文件句柄太多