Условно вернуть элемент в Map () с помощью Dart - PullRequest
0 голосов
/ 09 октября 2019

Допустим, у меня есть итерация (будь то карта (ключи), список, набор и т. Д.), И я хочу использовать 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:).

Любая помощьочень ценится!

1 Ответ

1 голос
/ 09 октября 2019

Конечно, есть способы обойти это, пожертвовав эффективностью и краткостью, зацикливая их до или после сопоставления значений, чтобы отфильтровать ненужные значения.

Ну, эффективность (не влияет на производительность), так как вы объединяете в цепочку итераторы, которые обрабатывают значения по одному. Поэтому использование where () здесь не должно быть проблемой.

Если вы хотите более компактное решение, вы можете сделать это (что создает новый список временно для каждого элемента в a, что делает его менее эффективным):

List<int> b = a.expand((e) => [if (e % 2 == 0) e * 10]).toList();

Для случая с Картой, я думаю, лучшее, что вы можете сделать, это использовать где. Я думал о другом решении, но закончил с этим беспорядком:

Map<int, String> c = Map.fromEntries(a.entries.expand((e) => [if (e.key % 2 == 0) MapEntry(e.key * 10, e.value)]));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...