mapValues와 친구들

맵의 값 전체, 키 전체, 또는 (key, value) 엔트리 전체를 변환합니다.

Map<K, T> mapValues<K, V, T>(T Function(V value) f, Map<K, V> map) Map<T, V> mapKeys<K, V, T>(T Function(K key) f, Map<K, V> map) Map<K2, V2> mapEntries<K, V, K2, V2>((K2, V2) Function((K, V) entry) f, Map<K, V> map)

강의

9장의 나머지는 맵에서 골라내거나(pick, omit, pickBy, omitBy) 일부를 읽습니다. 이 셋은 맵을 변환합니다. mapValues는 값마다 콜백을 돌리고 키는 건드리지 않으며, mapKeys는 그 반대, mapEntries(key, value) 레코드를 통째로 받아 새 레코드를 돌려줍니다.

그 레코드는 pickBy, omitBy, fromEntries가 이미 쓰는 것과 같은 모양입니다. 그래서 넷이 아무 변환 없이 이어집니다 — 하나로 거르고 다른 하나로 변환하면 됩니다. mapEntries는 나머지 둘을 일반화한 형태라서, e.$1e.$2를 맞바꾸면 한 번의 호출로 맵이 뒤집힙니다.

mapValues는 키를 건드리지 않으므로 엔트리를 잃을 일이 없습니다. mapKeysmapEntries는 다릅니다. 콜백이 두 키를 같은 결과로 보내면 순회 순서상 마지막 것이 이깁니다. 맵 리터럴에서 키가 겹쳤을 때와 똑같습니다. 그 밖에는 삽입 순서가 유지되며, 새 키가 처음 나타난 자리를 따릅니다.

filterfilterWithKey는 일부러 두지 않았습니다. pickByomitBy가 이미 레코드를 통째로 받으므로, 한쪽을 무시하는 것이 곧 다른 한쪽으로 거르는 방법입니다 — 두 번째 데모를 보세요.

바로 옆의 evolve와 비교해 보세요. 그쪽은 지정한 키의 값만 변환하고 나머지는 그대로 통과시킵니다. mapValues는 모든 값이 같은 처리를 받는 경우입니다.

데모 1 · 기본

데모 2 · 키 충돌, 그리고 곁들이는 필터

직접 해 보기

연습: 이름은 그대로 두고 점수를 등급 문자로 바꿔 보세요.

관련 항목: evolve — 지정한 키의 값만 변환 · pickBy / omitBy — 같은 레코드 모양의 키 인식 필터 · fromEntries — 레코드로 맵 만들기 · compactObject — null 값 걷어내기