См. Следующий фрагмент кода.
Для меня это выглядит слишком сложным и не кажется оптимальным решением этой проблемы. Но, честно говоря, другого решения не нахожу. Сопоставление с другими объектами должно разделять входные данные каждого слоя. Кроме того, каждый объект проверяется в соответствующем конструкторе, что приводит к положительному эффекту, заключающемуся в том, что только действительные данные предоставляются конкретным методам службы или репозитория.
Мои основные опасения:
Слишком много
continue
внутри циклаЧрезмерное использование
Set
Выглядит сложным
final List<UUID> providedIds = providedDTOS.stream().filter(PredicateUtils.distinctBy(InputDTO::getId)).map(SubDTO::getSubId).collect(Collectors.toList()); final Map<UUID, EntityProj> entityProjMap = serviceOne.getEntitiesByIds(providedIds).stream().filter(Objects::nonNull) .collect(Collectors.toMap(EntityProj::getId, entityProj -> entityProj)); final Set<SubTransferData> subTransferDataList = new HashSet<>(); final Set<UUID> fail = new HashSet<>(); final Set<UUID> dup = new HashSet<>(); final Set<UUID> seen = new HashSet<>(); for (InputDTO dto : providedDTOS) { if (Objects.isNull(dto.getDate())) { log.error("someError"); fail.add(dto.getId()); continue; } Optional<EntityProj> entity = Optional.ofNullable(entityProjMap.get(dto.Id())); if (entity.isEmpty()) { log.error("somerror"); fail.add(dto.getId()); continue; } if (!seen.add(dto.getId())) { log.warn("warning that seen"); dup.add(dto.getId()); continue; } final SubTransferData transferData = new transferData(params); subTransferDataList.add(transferData); } if (subTransferDataList.isEmpty()) { log.warn("warning that nothing left"); return new ResultObj(fail, dup, Set.of()); } final TransferData transferData = new TransferData(someProvidedId, subTransferDataList); final TransferResult result = repo.transferMyData(transferData); fail.addAll(result.getFail()); duo.addAll(result.getDups()); return new ResultObj(fail, dup, result.getStored());