Если ваши несколько повторений следуют точному шаблону (например, каждое нечетное повторение устанавливает receiver
, иначе sender
), или этот шаблон может быть извлечен в Set<Integer>
, вы можете использовать Map<Integer, Info>
, где ключ является Идентификатор Info
, выполнить итерацию по нему и установить только выбранные элементы.
List<Info> list = ... // List of Info
Map<Integer, Info> map = list.stream() // Stream
.filter(Objects::nonNull) // Filter null values
.filter(i -> i.getId() != null && i.getPartyNumber() != null) // Filter null fields
.collect(Collectors.toMap(Info::getId, i -> i)); // Collect to Map<Integer, Info>
for (int i=0; i<10; i++) { // The number of repetitions
if (map.containsKey(i)) { // If the ID was not filtered
Info info = map.get(i); // Get the Info
// Here the pattern comes
if (i % 2 == 0) { // you can either compare with a
// predefined Set of IDs
billing.setSenderId(info.getId());
billing.setSenderNumber(info.getPartyNumber()); // Sender
} else {
billing.setReceiverId(info.getId()); // Receiver
billing.setSellerNumber(info.getPartyNumber());
}
}
}
Решение будет различным и зависит от количества возможных настроек наряду с sender
и receiver
. Кроме того, расчет паттерна может быть основан на другой логике - я рекомендую проверить по ex. Set<Integer> senders
, который будет содержать идентификаторы, подходящие для установки в качестве отправителя, то же самое относится и к получателю и другим возможностям.
- За :
- Независимо от количества повторений
Info
длина решения остается неизменной (за исключением сбора всех Info
s для ввода list
).
- Позволяет избежать раздувания кода и повторений.
- Против :
- Вы должны продумать расчет и логику, чтобы определить, что нужно установить.
- Может выглядеть грязно и трудно для чтения.