for循环内部for循环代码优化

时间:2020-07-20 15:17:08

标签: java spring-boot optimization lambda java-8

我在内部循环中有一个循环,用于从seconde循环中删除元素,列表中的内容必须执行某些操作。我希望优化迭代和比较,可以做到吗?

如何优化下面显示的逻辑以避免太多的代码行

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);
            }

....
}

1 个答案:

答案 0 :(得分:0)

minLenghtOfEntities += field.getFieldLength();之后,缺少中断。

使用流,代码变得更加结构化,首先收集要删除的字段,然后纠正实体长度。

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);
    ...
}

不幸的是,由于containsSet<String> ignoreFields并不更好。