2017-12-28 72 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

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

私は変更可能なカウンタオブジェクトを行動するAtomicIntegerをとっています。 apache commons 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())); 
関連する問題