2017-12-28 49 views
1

Ich möchte in der Lage sein, eine Liste von Elementen mit fester Größe von 50 Elementen zu sammeln. Hier mache ich es gerade. Ich würde gerne Lambdas verwenden, wenn möglich.Wie kann ich Iterator Werte in eine Liste von 50 Elementen sammeln

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

Was Sie haben, ist in Ordnung, außer Sie vergessen, die Liste zu löschen/neu erstellen. Ich würde auch eine foreach-Schleife benutzen. Streams werden mit diesem Szenario nicht helfen. –

+0

Sie können [this] (https://stackoverflow.com/a/30072617/5457643) antworten, wenn Sie Streams verwenden möchten. – Turamarth

+0

Vielen Dank. Ich verstehe deine Herangehensweise! – BreenDeen

Antwort

0

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

ich AtomicInteger genommen haben als wandelbar Gegen Objekt zu handeln. Wenn Sie Apache commons lang API verwenden, ersetzen Sie AtomicInteger durch MutableInt Objekt.

Ansatz-2

Wenn Sie direkt Liste Objekt anstatt Iterator verwenden können, dann können wir wie unten codieren. Hier externes Gegenobjekt nicht erforderlich.

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

Vielen Dank, sehr geschätzt! – BreenDeen

1

Sie können es auf diese Weise tun:

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