I have an loop inside loop to remove the elements from the seconde loop, and what is present in the list has to perform certain actions. I wish to optimize the iteration and comparisons, can it be done?
How do I optimize my logic shown below to avoid so many lines of code
JavaScript
x
public MEntity getBuffer(String entityName, String Buffer, String ignoreFields) {
McgEntity entity = getElementsByEntityFromXml(entityName);
int minLenghtOfEntities = 0;
List<McgField> fieldsToRemove = new ArrayList<>();
if (ignoreFields != null && ignoreFields.length > 0) {
for (int i = 0; i < ignoreFields.length; i++) {
for (McgField field : entity.getFieldList()) {
if (field.getFieldName().contains(ignoreFields[i])) {
minLenghtOfEntities += field.getFieldLength();
fieldsToRemove.add(field);
}
}
}
entity.setLengthBuffer(entity.getLengthBuffer() - minLenghtOfEntities);
entity.getFieldList().removeAll(fieldsToRemove);
}
.
}
Advertisement
Answer
After minLenghtOfEntities += field.getFieldLength();
a break is missing.
With streams the code becomes a bit more structured, first collecting the fields to remove and then the entity lengths to correct.
JavaScript
public MEntity getBuffer(String entityName, String buffer, String ignoreFields) {
Objects.requireNonNull(ignoreFields);
McgEntity entity = getElementsByEntityFromXml(entityName);
List<McgField> fieldsToRemove = entity.getFieldList().stream()
.filter(f -> Arrays.stream(ignoreFields)
.anyMatch(f.getFieldName()::contains))
.collect(Collectors.toList());
int minLenghtOfEntities = fieldsToRemove.stream()
.mapToInt(McgField::getFieldLength).sum();
entity.setLengthBuffer(entity.getLengthBuffer() - minLenghtOfEntities);
entity.getFieldList().removeAll(fieldsToRemove);
}
Unfortunately because of contains
a Set<String> ignoreFields
is not better.