Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/322.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何将迭代器值收集到包含50个元素的列表中_Java_Lambda_Collections - Fatal编程技术网

Java 如何将迭代器值收集到包含50个元素的列表中

Java 如何将迭代器值收集到包含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

我希望能够收集50个元素的固定大小的元素列表。以下是我目前的做法。如果可能的话,我想使用lambdas

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;
            }))));