Java 8 使用Java 8使用LongStream批处理ArrayList

Java 8 使用Java 8使用LongStream批处理ArrayList,java-8,Java 8,我试图使用Java8的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

我试图使用Java8的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);
 }
}
但我得到以下例外。我试过用mapToLong代替map,但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
LongStream中的映射应该将LongStream中的一个元素映射到long,而不是列表

使用mapToObj:

或:


这个解决方案奏效了,谢谢!。我是否可以在此处使用LinkedList来维护元素的插入顺序,并批量维护顺序?还是ArrayList就足够了?此外,我喜欢使其同步以支持multithreading@Sawyer我认为没有理由使用LinkedList,因为它效率较低,没有随机访问。ArrayList还维护插入顺序。@Sawyer每个列表都维护顺序,这就是契约。也许,您将此与映射混淆,即LinkedHashMap和HashMap之间的差异,但这不适用于列表。如何更改上述批处理,以便批处理返回其处理的id列表。目前,它返回的是me@Sawyer首先,process方法必须返回一个列表。然后,您可以将forEachbatch->processbatch更改为flatMapbatch->processbatch.stream.collectCollectors.toList,这将生成一个包含所有已处理长度的列表。
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));
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));