в документации Dart у нас есть три итерируемых варианта выбрать для создания списков. Какой из них лучше всего подходит для каких целей и какой более эффективен для каких целей?

0
rushikesh127001 1 Май 2020 в 07:47

2 ответа

Лучший ответ

По сути, вы никогда не должны использовать ни один из этих конструкторов.

У каждого есть свое применение, но большинство из этих применений теперь могут быть написаны с использованием списочных литералов.

List.generate является подвеской для List.filled. Последний создает список, заполненный одинаковым значением в каждом слоте, первый позволяет вычислять новое значение для каждого слота. С collection-for я бы, наверное, написал:

 var newList = [for (var i = 0; i < 10; i++) compute(i)];

Вместо

 var newList = List.generate(10, compute);

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

Я также сказал бы, что вы не должны никогда использовать List.of(something). Вместо этого используйте something.toList() или [...something]. Если вам нужно выполнить преобразование, скажем, создать List<num> из Iterable<int>, вы можете сделать <num>[...something], но вы не можете использовать toList. Если вам нужно сделать фиксированной длины List<num>, ... тогда я думаю, что List<num>.of(something, growable: false) на самом деле самое простое решение.

Единственная причина использовать List.from - это когда исходный итерируемый тип не имеет такого строгого типа, как необходимо. Если вы знаете, что ваш Iterable<num> содержит только целые числа, вы можете сделать List<int>.from(iterable). Вы также можете сделать iterable.cast<int>().toList() или [for (var v in iterable) v as int], но List.from может быть короче. Всегда предоставляет переменную типа для List.from.

Итак, в общем: используйте только один из этих конструкторов, если вам нужен список фиксированной длины (с передачей growable: false), или если вы хотите уменьшить число элементов с помощью List.from, а затем всегда предоставлять введите аргумент.

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

1
lrn 1 Май 2020 в 11:10

List.generate - это полезно, если источник вашего списка не имеет типа List или если вам нужна специальная логика при получении элементов списка;

List.of - проверка типов выполняется во время компиляции.

List.from - проверка типа выполняется только во время выполнения.

Оба List.of и List.from работают одинаково. Но вы должны предпочесть List.of над List.from, чтобы проверка типов выполнялась уже во время компиляции.

Если вы хотите посмотреть поближе, посмотрите на этот пример: https://dartpad.dev/b9cd4acdeec266cb366a16

1
kbaylosis 1 Май 2020 в 09:26