Java 如何将迭代器值收集到包含50个元素的列表中
我希望能够收集50个元素的固定大小的元素列表。以下是我目前的做法。如果可能的话,我想使用lambdasJava 如何将迭代器值收集到包含50个元素的列表中,java,lambda,collections,Java,Lambda,Collections,我希望能够收集50个元素的固定大小的元素列表。以下是我目前的做法。如果可能的话,我想使用lambdas List<Contact> contactList=getContacts(); Iterator<Contact> it=contactList.iterator(); List<Contact> batch=new ArrayList<>(); while(it.hasNext()) { if(batch.size()<50
List<Contact> contactList=getContacts();
Iterator<Contact> it=contactList.iterator();
List<Contact> batch=new ArrayList<>();
while(it.hasNext()) {
if(batch.size()<50) {
batch.add(it.next())
} else {
processBatch(batch);
}
//When iterator has less than 50 elements
if (!it.hasNext() && batch.size()<50) {
processBatch(batch);
}
}
List contactList=getContacts();
Iterator it=contactList.Iterator();
列表批处理=新建ArrayList();
while(it.hasNext()){
如果(batch.size(),您可以这样做:
Iterable<String> iterable = () -> it;
contactList.addAll(StreamSupport.stream(iterable.spliterator(), false)
.limit(50)
.collect(Collectors.toList()));
Iterable Iterable=()->it;
contactList.addAll(StreamSupport.stream(iterable.spliterator(),false)
.限额(50)
.collect(Collectors.toList());
方法1
public static void main(String[] args) {
List<Integer> list = IntStream.range(0, 280).boxed().collect(toList());
AtomicInteger count = new AtomicInteger();
StreamSupport.stream(list.spliterator(), false)
.collect(groupingBy(e -> count.getAndIncrement() / 50,
collectingAndThen(toList(), l -> {
processBatch(l);
return null;
})));
}
public static <T extends Object> void processBatch(List<T> list) {
System.out.println(list.size());
}
你所拥有的一切都很好,只是你忘了清除/重新创建列表。我也会使用foreach循环。Streams对这种情况没有帮助。如果你想使用Streams,你可以调整答案。谢谢,非常感谢!
IntStream.range(0, list.size()).mapToObj(i -> new Object[] { i, list.get(i) }).collect(groupingBy(
arr -> (int) arr[0] / 50, Collectors.mapping(arr -> arr[1], collectingAndThen(toList(), l -> {
processBatch(l);
return null;
}))));