2015-12-03 4 views
0

Я хочу оптимизировать свой код, и для этого я хочу параллельно выполнять итерацию через Maps.Параллельная итерация в FOR EACH Loop

Мой текущий код:

for (String orderKey: insertMap.keySet()) { 
    if(orderKey.contains('#New')) { 
     //Do big stuff: (500 lines) 
    } 
} 

for (String orderKey: updateMap.keySet()) { 
    if(orderKey.contains('#New')) { 
     //Do same big stuff as above: (500 lines) 
    } 
} 

EDIT: Добавление типов Карта

Map<String,CustomObject> insertMap,updateMap = new Map<String,CustomObject>(); 

Теперь, как вы можете видеть, то внутреннее IF состояние такое же, только значения из orderKey происходят с разных карт.

Значения orderKey будут отличаться от каждой Карты. Они никогда не будут прежними.

Есть ли способ объединить эти FOR Петли в одном? Может быть, как:

for((String orderKey : insertMap.keySet()) OR (String orderKey : udpateMap.keySet())) 
{ 
    if(orderKey.contains('#New')) { 
     //Do big stuff 
    } 
} 

Я знаю, что приведенный выше код не представляется возможным, я просто хотел показать, что я ищу.

Число линий, которые я замаскировал //Do Big Stuff, составляет почти 500. И поэтому я хочу уменьшить количество строк кода.

Большое спасибо!

+1

move // ​​Делаем большой материал: (500 строк) в методе и называем его там. если есть какой-то шаг по притирке, перемещайте их одним способом и выполняйте разные шаги в разных методах и вызывайте их оба в if. – StackFlowed

+0

. Каковы типы значений здесь? Пожалуйста, обновите свой код и ваш вопрос, чтобы включить: 1) объявление типа как insertMap, так и updateMap 2) уточнить, будут ли две карты содержать одни и те же клавиши; 3) если обе карты содержат один и тот же ключ, следует делать «Делать большой материал» один раз или дважды для значений на каждой из этих карт? – whaley

+0

@whaley Привет, я добавил требуемое редактирование. Две карты не будут содержать одни и те же клавиши. –

ответ

2

В Java 8 можно использовать Stream.concat:

Stream.concat(insertMap.keySet().stream(), updateMap.keySet().stream()) 
    .filter(orderKey -> orderKey.contains("#New")) 
    .forEach(orderKey -> { 
     ... 
    }); 

компании Google Guava library имеет Iterables.concat:

for (String orderKey: Iterables.concat(insertMap.keySet(), updateMap.keySet())) { 
    ... 
} 

И, конечно же, самый "низкий технический" способ будет просто извлечь метод:

for (String orderKey: insertMap.keySet()) { 
    if (orderKey.contains("#New")) { 
     doBigStuff(orderKey); 
    } 
} 

for (String orderKey: updateMap.keySet()) { 
    if (orderKey.contains("#New")) { 
     doBigStuff(orderKey); 
    } 
} 
+0

Я использую этот код в Salesforce Apex, поэтому я не могу использовать пользовательские библиотеки! –

+0

Спасибо. Мне нужно будет проверить, поддерживает ли Apex функции Java 8. Если да, то это сработает. –

1

Если вы хотите параллелизм, первый дополнительный ct функция doStuff (ключ) для класса, реализующего интерфейс Runnable.

Затем определите исполнитель пула потоков с таким количеством потоков, сколько вам нужно. Ваши циклы могут оставаться, но вместо вызова вашей функции создайте экземпляр нового класса и отправьте своему исполнителю.