2017-12-28 7 views
1

50 개 요소의 고정 크기 요소 목록을 수집 할 수 있기를 원합니다. 내가 현재 어떻게하고 있는지 알려드립니다. 가능하면 람다를 사용하고 싶습니다.반복자 값을 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); 
    } 
} 
+1

목록을 지우거나 다시 만드는 것을 잊은 경우를 제외하고는 문제가 없습니다. 나는 foreach 루프도 사용할 것이다. 스트림은 그 시나리오에 도움이되지 않습니다. –

+0

스트림을 사용하려면 [this] (https://stackoverflow.com/a/30072617/5457643) 응답을 적용 할 수 있습니다. – Turamarth

+0

고맙습니다. 당신의 접근 방식을 이해합니다! – BreenDeen

답변

0

접근-1 나뿐만 가변 카운터 개체를 행동 AtomicInteger을 촬영 한

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

. apache lang API를 사용하는 경우 AtomicIntegerMutableInt 개체로 바꿉니다. 직접 오히려 반복자를 사용하는 것보다 목록 개체를 사용할 수있는 경우

접근-2

, 우리는 아래와 같이 코딩 할 수 있습니다. 여기서 외부 카운터 객체는 필요하지 않습니다.

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

고마워요, 정말 고마워요! – BreenDeen

1

당신은 그 방법으로 그것을 수행 할 수 있습니다

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