Java 8 使用Java 8使用LongStream批处理ArrayList
我试图使用Java8的LongStream处理一个包含Long类型内容的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
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));