나는 세련된 코드 람다 함수를 사용하는 방법을 배우려고 노력하지만,이 작품을 만들기 위해 고군분투하고있다.
나는 두 개의리스트가 있습니다. "오래된"목록은 항상 짧은 또는 "업데이트 목록"과 같은 길이입니다. 나는 "업데이트 목록"에서 개체를 타고 짧은 "이전 목록"의 "오래된 객체를"덮어 쓸 것인지. 목록은 각 개체에 대한 고유 필드가 있습니다.
예를 들어, 새로운 버전의 도서관에서 책을 업데이트 같은 비트입니다. 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));