Допустим, у меня есть итерация (будь то карта (ключи), список, набор и т. Д.), И я хочу использовать Map (), чтобы преобразовать ее в другую итерацию с помощью функции f. Однако я хочу, чтобы f возвращал значение только в том случае, если условие выполнено после его преобразования.
List<int> a = [1,2,3,4,5,6];
List<int> b = a.map((e) => (e % 2 == 0) ? e * 10 : null);
assert(b == [20,40,60]);
Однако это возвращает ошибку, как и любой аналогичный эквивалент в map с mapEntry, такой как:
Map<int, String> a = {1:a, 2:b, 3:c, 4:d, 5:e, 6:f};
Map<int, String> b = a.map((k,v) => (k % 2 == 0) ? MapEntry(k*10,v) : null);
assert(b.keys.toList<int>() == [20,40,60]);
Конечно, есть способы обойти это, пожертвовав эффективностью и краткостью, зацикливая ее до или после сопоставления значений, чтобы отфильтровать ненужные значения. Например:
List<int> b = a.where((e) => e%2).map((e) => e * 10);
List<int> b = a.map((e) => e * 10).where((e) => e%2);
Или просто вручную зацикливание с помощью for ... in или forEach () и итерация по a
с условным добавлением измененного результата к b
, но это будет длинным кодом ине хватило бы карты оптимизации () для специализированной операции.
Дайте мне знать, если это вообще возможно - микрооптимизации накапливаются для больших успехов imho:).
Любая помощьочень ценится!