【问题标题】:How to build a collection based on Cartesian product of all elements of other collections?如何基于其他集合的所有元素的笛卡尔积构建一个集合?
【发布时间】:2012-10-29 18:51:12
【问题描述】:

您能否分享在 Scala 中基于多个数组/另一个集合中的项目的完整迭代创建不可变集合的任何好的解决方案?

例如在 Java 中你可以使用:

List<String> signals = ...;
List<SignalState> states = ...;

List<SignalAndState> result = new ArrayList<~>(signals.size() * states.size());

for (String signal: signals) {
  for (SignalState state: states) {
    // some if() condition or process() function can be here 
    result.add(new SignalAndState(signal, state))
  }
}

使用 Scala 构建这样的东西的最佳实践是什么? 我认为,相同的方法(在 for() 中使用 for())是个坏主意,并且与 Scala 语言的对象功能性质完全不兼容。

【问题讨论】:

标签: java scala collections


【解决方案1】:

我不确定最佳实践,但您可以实现此目的的一种方法是对我们使用 for 理解来创建您正在寻找的集合:

val signals = List[String](...)
val states = List[SignalState](...)

for(signal <- signals; state <- states) yield new SignalAndState(signal, state)

这应该产生一个包含所有元素的List[SignalAndState]

或者,您可以使用flatMapmap 来完成相同的结果,例如:

signals flatMap ( signal => states map ( state => new SignalAndState(signal, state)))

【讨论】:

  • 顺便说一下,上面的代码(带有 for comprehension 的代码)将由编译器在内部翻译成带有 flatMap/map 的第二个代码
  • 为什么在 Scala 中使用 List,因为 Scala 和 Java 中的 List 完全不同? Scala 中的 List 实现为 LinkedList
猜你喜欢
  • 2020-07-05
  • 2012-09-07
  • 2015-01-28
  • 2018-09-28
  • 1970-01-01
  • 1970-01-01
  • 2010-10-17
  • 1970-01-01
相关资源
最近更新 更多