Сравнение входного списка со списком объектов репозитория: выполнение цикла занимает больше времени - PullRequest
0 голосов
/ 26 октября 2018

Я получаю список объектов List<APIObjects> apiObjectList в качестве входных данных для моего API (через HTTP-сообщение), мне нужно сравнить этот входной список с моим списком объектов-сущностей, который я получаю, выполняя repository.findAll() с Spring-boot-data-JPA framework

В настоящее время я зацикливаю List<DatabaseObject> и затем нахожу, есть ли совпадение.Ниже приведен мой код

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), не является правильным или профессиональным способом ее решения

APIObject.java

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

DatabaseObject.java

@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@Entity
@Table(name = "my_table")
public class DatabaseObject {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    Long id;

    @Column(name = "name")
    String name;

    @Column(name = "group_id")
    String groupId;

    @Column(name = "artifact_id")
    String artifactId;

    @Column(name = "version")
    String version;
    }

1 Ответ

0 голосов
/ 26 октября 2018

Я бы переопределил equals и hashCode в обоих моих энти, которые содержат три атрибута groupId, artifactId, version, затем отсортировал два списка на основе трех arrtibutes, и просто использовал .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);

С ломбоком вы можете использовать:

@EqualsAndHashCode(of = {"groupId", "artifactId", "version"})
class DatabaseObject {..}
...