Как насчет использования карты для хранения индекса и затем хорошего значения для l oop:
List<Pair<SomeObject, Integer>> process(List<SomeObject> input) {
List<Pair<SomeObject, Integer>> result = new ArrayList<>();
Map<Integer, Pair<SomeObject, Integer>> map = new HashMap();
List<SomeObject> couldBeProcessed = new ArrayList<>();
for (int i = 0; i < input.size(); i++) {
if (couldBeProcessed(input.get(i))) {
couldBeProcessed.add(obj);
} else {
map.put(i, Pair.newInstance(obj, 0));
}
}
List<Pair<SomeObject, Integer>> processResult = processInBatch(couldBeProcessed);
for (int i = 0; i < input.size(); i++) {
if (map.containsKey(i)) {
result.add(map.get(i));
} else {
result.add(processResult.remove(0));
}
}
}
Вы также можете использовать Map#computeIfAbsent
, чтобы сделать второй л oop более компактно:
for (int i = 0; i < input.size(); i++) {
result.add(map.computeIfAbsent(i, index -> processResult.remove(0));
}
PS: элементы processResult
должны иметь те же индексы, что и соответствующие объекты из исходного списка.
@ Миша предлагает более естественный способ обрабатывать обработанную очередь - используя Deque
:
Deque<Pair<SomeObject, Integer>> processResult = new ArrayDeque(processInBatch(couldBeProcessed));
for (int i = 0; i < input.size(); i++) {
if (map.containsKey(i)) {
result.add(map.get(i));
} else {
result.add(processResult.removeFirst());
}
}