[英]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.