Как использовать map () для нескольких списков? - PullRequest
0 голосов
/ 05 ноября 2018

Я хочу получить что-то вроде этого:

[list1, list2].map( (var1, var2) => do something with var1;
do something with var2)

Я пытался:

List<int> counts = [1,2,3];
List<String> strings = ['','2',''];
print([counts, strings].map((list) => list[0].isEven; list[1].lenght))

Ответы [ 4 ]

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

В дополнение к zipList, представленному в принятом ответе, здесь есть listIterable, который может быть полезен, если у вас есть итерации, которые еще не являются списками.

Iterable<T3> zipIterable<T1, T2, T3>(Iterable<T1> l1, Iterable<T2> l2, T3 Function(T1, T2) zipper) sync* {
  var i1 = l1.iterator;
  var i2 = l2.iterator;
  while(true) {
    var fin1 = !i1.moveNext();
    var fin2 = !i2.moveNext();
    if (fin1 != fin2) {
      throw ArgumentError("Two iterables must have the same length");
    }
    if (fin1) {
      return;
    }
    yield zipper(i1.current, i2.current);
  }
}
0 голосов
/ 05 ноября 2018

Звучит так, как будто вы хотите функцию zip, которую дартс не предоставляет по умолчанию. Быстрая реализация будет выглядеть примерно так:

List<T3> zipList<T1, T2, T3>(List<T1> l1, List<T2> l2, T3 Function(T1, T2) zipper) {
  if (l1.isEmpty) throw ArgumentError.value(l1, "l1", "input list cannot be empty");
  if (l1.length != l2.length) throw ArgumentError("Two lists must have the same length");
  var result = List<T3>(l1.length);
  for(var i = 0; i < l1.length; i++) {
    result.add(zipper(l1[i], l2[i]));
  }
  return result;
}

// here a quick example of how to use it.
class Bar {
  final int i;
  final String s;
  Bar(this.i, this.s);

  @override
  String toString() => "Bar: $i - $s";
}

void testZipList() {
  var list1 = [1,2,3];
  var list2 = ["", "2", ""];
  var bars = zipList(list1, list2, (l1, l2) => Bar(l1, l2));
  bars.forEach(print);
}
0 голосов
/ 06 ноября 2018

IterableZip из package:collection должно помочь.

https://pub.dartlang.org/documentation/collection/latest/collection/IterableZip-class.html

IterableZip([list1, list2]).map((values) {
    doSomethingWith(values[0]);
    doSomethingWith(values[2]);
});
0 голосов
/ 05 ноября 2018

Звучит так, будто https://pub.dartlang.org/documentation/async/latest/async/StreamZip-class.html - это то, что вы хотите.

Сначала преобразуйте list1 и list2 в их отдельные потоки, а затем используйте StreamZip для объединения обоих потоков.

Это, например, превратит оба значения в поток строк, содержащих оба значения:

StreamZip([list1, list2]).map((valuePair) => "${valuePair[0]}, ${valuePair[1]}"));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...