Существует ли идиома Dart для Map.mapValues ​​((value) => newValue), которая не затрагивает все ключи? - PullRequest
0 голосов
/ 07 января 2019

Я написал следующую небольшую служебную функцию, которая облегчает чтение моего кода:

mapValues(Map map, Function f) => map.map((k, v) => MapEntry(k, f(v)));

Вот пример использования этой функции для преобразования данных json, как это делает и учебник AngularDart Heros:

class RouteRefs {
  final Map<String, List<RouteRef>> routesByNetwork;

  RouteRefs(this.routesByNetwork);

  static RouteRefs fromJson(Map<String, dynamic> json) {
    var rawMap = json["routesByNetwork"] as Map;
    return RouteRefs(mapValues(rawMap, routeRefsFromJson));   // !! here !!
  }

  static Iterable routeRefsFromJson(routeList) {
    return (routeList as List)
        .map((rawRef) => RouteRef.fromJson(rawRef as Map))
        .toList();
  }
}

Есть ли уже стандартная библиотека или функция библиотеки утилит, которая делает это? Если нет, рекомендуется ли писать это как функцию верхнего уровня в пакете утилит (или для начала, чтобы он был компактнее) в файле с исходным кодом утилиты?

И так как я уже скопировал этот код здесь, я мог бы также спросить кое-что связанное: код, как в routeRefsFromJson, имеет небольшую избыточность с аналогичными методами во многих других модельных классах. Есть ли еще лучший способ уменьшить избыточность без чрезмерного абстрагирования кода?

1 Ответ

0 голосов
/ 08 января 2019

Есть ли уже стандартная библиотека или функция библиотеки утилит, которая делает это?

Не специально для этого.

Если нет, рекомендуется ли записывать это как функцию верхнего уровня в пакете утилит (или для начала, чтобы сохранить его) в исходном файле утилиты?

Я бы так сказал, да. Хотя я бы переписал вашу функцию так:

Map<K, V2> mapValues<K, V1, V2>(Map<K, V1> map, V2 Function(V1) f) =>
  map.map((k, v) => MapEntry(k, f(v)));

Есть ли еще лучший способ уменьшить избыточность без чрезмерного абстрагирования кода?

Я бы использовал https://pub.dartlang.org/packages/json_serializable - он обрабатывает дублирующую плиту котла!

...