使用 Java 8 通过 LongStream 批量处理 ArrayList

Saw*_*yer 2 java-8

我正在尝试使用 Java 8 的 LongStream 处理具有 Long 类型内容的 ArrayList,如下面给定的示例所示,但出现以下错误。

import java.util.*;
import java.util.stream.*;

 public class HelloWorld{
 public static void main(String []args){
    List<Long> data=new LinkedList();
     for(Long j=0L;j<300L;j++){
        data.add(j);
    }
   int BATCH = 10;

   LongStream.range(0, (data.size()+BATCH-1)/BATCH)
     .mapToLong(i -> data.subList(i*BATCH, Math.min(data.size(), (i+1)*BATCH)))
     .forEach(batch -> process(batch));
 }

static void process(List<Long> list){
     System.out.println(list);
 }
}
Run Code Online (Sandbox Code Playgroud)

但我得到以下例外。我尝试过使用mapToLong插入地图,但mapToLong未被识别

$javac HelloWorld.java
 HelloWorld.java:13: error: incompatible types: possible lossy 
 conversion from long to int
     .map(i -> data.subList(i*BATCH, Math.min(data.size(), 
 (i+1)*BATCH)))
                             ^
HelloWorld.java:14: error: incompatible types: long cannot be 
converted to List<Long>
     .forEach(batch -> process(batch));
                               ^
 2 errors
Run Code Online (Sandbox Code Playgroud)

Era*_*ran 5

mapinLongStream应该将 the 的元素映射LongStream到 a long,而不是 a List

使用mapToObj

LongStream.range(0, (data.size()+BATCH-1)/BATCH)
          .mapToObj(i -> data.subList((int)i*BATCH, (int)Math.min(data.size(), (i+1)*BATCH)))
          .forEach(batch -> process(batch));
Run Code Online (Sandbox Code Playgroud)

或者:

IntStream.range(0, (data.size()+BATCH-1)/BATCH)
          .mapToObj(i -> data.subList(i*BATCH, Math.min(data.size(), (i+1)*BATCH)))
          .forEach(batch -> process(batch));
Run Code Online (Sandbox Code Playgroud)

  • @Sawyer我没有看到使用LinkedList的理由,因为它的效率较低(没有随机访问)。ArrayList 还维护插入顺序。 (3认同)
  • @Sawyer 首先,“process”方法必须返回一个“List&lt;Long&gt;”。然后你可以将`forEach(batch -&gt; process(batch))`更改为`flatMap(batch -&gt; process(batch).stream()).collect(Collectors.toList())`,这将产生一个` List&lt;Long&gt;` 包含所有已处理的 `Long`。 (3认同)