如何将类型X的Iterable转换为类型Y Re:Iterable <wordpair>到Iterable <string>

时间:2018-04-29 18:55:02

标签: dart iterable

在pubspec.yaml中,我使用english_words库生成wordpairs:

dependencies:
 flutter:
   sdk: flutter

 # Contains a few thousand of the most used English words
 # plus some utility functions.
 english_words: ^3.1.0

现在WordPair类不是String的子类型,所以我不能使用Iterable的lambdas或者像cast或retype这样的函数来演绎&#39; &#39; WordPairs&#39;到弦乐。

所以,我必须编写名为getWords()的函数。

请参阅下面包含此实现的Dart文件Model.dart。

你会看到旧行注释掉它在getter中返回的类型Iterable。

有没有更有效的方法来做到这一点?

例如,我不想在转换中涉及List Class,但我找不到任何其他方法来成功执行此操作。

感谢。

---------------- Model.dart

 import 'package:english_words/english_words.dart' show WordPair, generateWordPairs;

 import 'dart:collection';

 /// Model Class
 ///
 class Model {

 String get randomWordPair => new WordPair.random().asPascalCase;

   //  Iterable<WordPair> get wordPairs =>  generateWordPairs().take(10);

 Iterable<String> get wordPairs => getWords();


  Iterable<String> getWords(){

     Iterable<WordPair> pairs = generateWordPairs().take(10);

     ListWords<String> words = new ListWords();

     for (var pair in pairs) {

       words.add(pair.asString);
     }

     return words;
   }
}


class ListWords<E> extends ListBase<E> {

  final List<E> l = [];

  set length(int newLength) { l.length = newLength; }

  int get length => l.length;

  E operator [](int index) => l[index];

  void operator []=(int index, E value) { l[index] = value; }
}

2 个答案:

答案 0 :(得分:1)

乍一看,收集表达式结果的循环通常可以用.map上适当的Iterable方法调用替换。看看这是否有帮助。

答案 1 :(得分:0)

在Dart 2中,您可以使用

iterable.cast<NewType>()

但如果经常访问结果列表,则很容易导致效率低下,因为它将原始迭代包装成新的迭代并且必须转发每次访问。

通常效率更高

new List<NewType>.of(oldList)

new List.from<NewType.from(oldList)

我无法从文档中获得.of()from()之间的差异(https://api.dartlang.org/dev/2.0.0-dev.50.0/dart-core/List/List.from.htmlhttps://api.dartlang.org/dev/2.0.0-dev.50.0/dart-core/List/List.of.html

相关问题