【问题标题】:How to convert an Iterable of type X to type Y Re: Iterable<WordPair> to Iterable<String>如何将 X 类型的 Iterable 转换为 Y 类型 Re: Iterable<WordPair> 到 Iterable<String>
【发布时间】:2018-10-09 22:31:05
【问题描述】:

在 pubspec.yaml 中,我使用english_words 库来生成单词对:

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 的 lambda 或类似 cast 或 retype 的函数将“WordPairs”“转换”为字符串。

所以,我不得不编写名为 getWords() 的函数。

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

您会看到旧行被注释掉,它在 getter 中返回类型 Iterable。

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

例如,我不想在转换中涉及 List 类,但我找不到任何其他方法来成功地做到这一点。

谢谢。

---------------- 模型.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; }
}

【问题讨论】:

  • 这个问题你解决了吗?
  • @sutch 像 Stackoverflow 上的许多事情一样,我已经转向其他问题......

标签: dart iterable


【解决方案1】:

在 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.html,https://api.dartlang.org/dev/2.0.0-dev.50.0/dart-core/List/List.of.html)

【讨论】:

  • 这是最好的答案,非常感谢
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2010-11-07
    • 2021-08-16
    • 2019-03-14
    • 1970-01-01
    • 2020-08-11
    • 2021-08-24
    • 1970-01-01
    • 2021-06-19
    • 2017-03-19
    相关资源
    最近更新 更多