에 "ID"필드 목록의 하위 섹션을 업데이트

JCOV :

나는 세련된 코드 람다 함수를 사용하는 방법을 배우려고 노력하지만,이 작품을 만들기 위해 고군분투하고있다.

나는 두 개의리스트가 있습니다. "오래된"목록은 항상 짧은 또는 "업데이트 목록"과 같은 길이입니다. 나는 "업데이트 목록"에서 개체를 타고 짧은 "이전 목록"의 "오래된 객체를"덮어 쓸 것인지. 목록은 각 개체에 대한 고유 필드가 있습니다.

예를 들어, 새로운 버전의 도서관에서 책을 업데이트 같은 비트입니다. UUID를 (제목 + 저자)는 동일하게 유지되지만 새 개체는 새 책 / 객체 선반에 이전을 대체합니다.

나는 그에게 "먼 길을"할과를 만들 수 알고 HashMap<MyUniqueFieldInMyObject, MyObject>다음 새를 취할 List<MyUpdatedObjects>와 동일한 작업을 수행.

즉 유무 HashMap<UniqueField, MyOldObject>와는 HashMap<UniqueField, MyUpdatedObject>다음 의사 "업데이트 된 오브젝트가 같은 키를 가진 항목이있는 경우, 업데이트 된 값으로 값을 덮어 쓰기"로 기존의 객체를 반복 ...

그러나...

기능 람다 문이 할 수있는 "더 좋은"단락 방법이 있나요?

나는의 라인을 따라 생각하고 있었다 :

List<MyObject> updatedList;
List<MyObject> oldList;

updatedList.forEach(MyObject -> {

    String id = MyObject.getId();

    if (oldList.stream().anyMatcher(MyObject -> 
        MyObject.getId().matches(id)) {
           //Do the replacement here? If so...how?
       }
}

어떤 I 분실하고있는 곳입니다!

어떤 지침을 주셔서 감사합니다.

미샤 :

오히려 새 목록을 만드는 것보다 장소의 목록을 업데이트하려면, 당신은 사용할 수 있습니다 List.replaceAll:

oldList.replaceAll(old -> 
    updateListe.stream()
        .filter(updated -> updated.getId().equals(old.getId())
        .findFirst()
        .orElse(old)
);

이 용액의 주된 문제는 복잡성이 O 점이다 (크기의 세 * 크기 -의 갱신). 당신이 이전 목록의 모든 항목에 대한 전체 업데이트 목록을 반복하는 것으로부터 당신을 보호 할 수 있습니다 "먼 길"로 설명하는 방법 :

// note that this will throw if there are multiple entries with the same id
Map<String, MyObject> updatedMap = updatedList.stream()
                                         .collect(toMap(MyObject::getId, x->x));

oldList.replaceAll(old -> updatedMap.getOrDefault(old.getId(), old));

추천

출처http://43.154.161.224:23101/article/api/json?id=167281&siteId=1