将输入列表与存储库对象列表进行比较:循环执行需要更多时间

时间:2018-10-26 08:34:48

标签: java hibernate java-8 spring-data-jpa java-stream

我获得了对象列表List<APIObjects> apiObjectList作为我的API的输入(通过HTTP-Post),我需要将此输入列表与我通过执行{{1}得到的实体对象列表进行比较} repository.findAll()框架

当前,我循环Spring-boot-data-JPA,然后查找是否存在匹配项。以下是我的代码

List<DatabaseObject>

但是,这种循环似乎要消耗大量的时间和内存,如何用Lambda函数解决呢?我很确定上面显示的当前方法(DatabaseObject的循环)不是解决该问题的正确方法或专业方法

APIObject.java

public Boolean findIfAllAPIobjectsExist (List<APIObject> apiObjects) {
    List<DatabaseObject> databaseObjectsList = databaseRepository.findAll()

    return apiObjects.stream().allMatch {
        apiObject -> {
            for (DatabaseObject dbObject : databaseObjectsList) {
                if ((dbObject.getGroupId().trim().equals(dbObject.getGroupId().trim())) &&
                                (dbObject.getArtifactId().trim() .equals(dbObject.getArtifactId().trim())) &&
                                (dbObject.getVersion().trim().equals(dbObject.getVersion().trim()))) {
                            System.out.println("Matching ..");
                            return true;
                        }
                    }
                    return false;
            }
        }

    }

}

DatabaseObject.java

@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class APIObject{
    private String groupId;
    private String artifactId;
    private String version;
}

1 个答案:

答案 0 :(得分:2)

我将覆盖两个拥有三个属性equals的实体中的hashCodegroupId, artifactId, version,然后根据三个arrbutbuts对两个List进行排序,并仅使用{{1} },以确定两个列表是否相等:

.equals

使用龙目岛,您可以使用:

databaseObjectsList.sort(
        Comparator.comparing(DatabaseObject::getGroupId)
                .thenComparing(DatabaseObject::getArtifactId)
                .thenComparing(DatabaseObject::getVersion)
);
apiObjects.sort(Comparator.comparing(APIObject::getGroupId)
        .thenComparing(APIObject::getArtifactId)
        .thenComparing(APIObject::getVersion)
);

return databaseObjectsList.equals(apiObjects);