简体   繁体   English

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

[英]How can I collect Iterator values into a list of 50 elements

I want to be able to collect a list of elements of fixed size of 50 elements.我希望能够收集固定大小为 50 个元素的元素列表。 Here is how I am currently doing it.这是我目前的做法。 I would like to use lambdas if possible.如果可能,我想使用 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);
    }
}

You can do it in that way :你可以这样做:

 Iterable<String> iterable = () -> it;
 contactList.addAll(StreamSupport.stream(iterable.spliterator(), false)
            .limit(50)
            .collect(Collectors.toList()));

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

I have taken AtomicInteger to act as mutable counter object.我已将AtomicInteger用作可变计数器对象。 If you are using apache commons lang API then replace AtomicInteger with MutableInt object.如果您使用的是 apache commons lang API,则将AtomicInteger替换为MutableInt对象。

Approach-2方法二

If you can directly use list object rather than using iterator, then we can code like below.如果您可以直接使用列表对象而不是使用迭代器,那么我们可以编写如下代码。 Here external counter object not require.这里不需要外部计数器对象。

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM