This topic created in 4327 days ago, the information mentioned may be changed or developed.
一个 iterator 每次产生一个 deal,我打算攒 10 个 deal 进行一次处理,现在的问题是因为无法判断最后一次next() 导致处理程序要写两遍:
List<Deal> pendingDeals=new ArrayList<Deal>();
while(iterator.hasNext()){
pendingDeals.add(iterator.next());
if(!pendingDeals.isEmpty()pendingDeals.size()%10==0){
process(pendingDeals);
}
}
//这里非常纠结,是否可以优化?
if(!pendingDeals.isEmpty()){
process(pendingDeals);
}
6 replies • 2014-08-03 19:52:22 +08:00
 |
|
1
kalasoo Aug 3, 2014
``` while(true) { if (iterator.hasNext()) { pendingDeals.add(iterator.next()); if (!pendingDeals.isEmpty() && pendingDeals.size() == 10) { process(pendingDeals); } } else { if (!pendingDeals.isEmpty()) { process(pendingDeals); } break; } } ``` 或者
``` var end = false; //对不起啊,我Java写的不好,我就把逻辑先放在这里 while(true){ end = !iterator.hasNext(); if ((end || pendingDeals.size() == 10) && !pendingDeals.isEmpty()) { process(pendingDeals); } if (end) { break; } else { pendingDeals.add(iterator.next()); } } ```
|
 |
|
2
deepsleep Aug 3, 2014 1
个人觉得不用再优化了,原来那样就可以了。
|
 |
|
3
incompatible Aug 3, 2014 1
楼主这个没法优化了吧 有buffer就要有flush 类比一下:你用OutputStream做了若干write操作,最后总得flush()一下
ps: 你得这么写才像java
``` DealProcessor p = new DealProcessorImpl();
while(iterator.hasNext()){ p.process(iterator.next); }
p.flush(); ```
``` interface DealProcessor { public void process(Deal deal); public void flush(); } ```
``` class DealProcessorImpl { private final static int BATCH_SIZE = 10; private List<Deal> dealList = new ArrayList<Deal>();
public void process(Deal deal) { dealList.add(deal); if (dealList.size() == BATCH_SIZE) { process(dealList): dealList.clear(); } }
public void flush() { if (dealList.size() > 0) { process(dealList): dealList.clear(); } }
protected void process(List<Deal> batch) { // add your implementation here } ```
|
 |
|
6
watzds Aug 3, 2014 1
List<Deal> pendingDeals=new ArrayList<Deal>(); while(iterator.hasNext()){ pendingDeals.add(iterator.next()); if(!pendingDeals.isEmpty() && (pendingDeals.size()%10==0 || !iterator.hasNext())){ process(pendingDeals); } }
|