如何基于其他集合的所有元素的笛卡尔积构建集合?

时间:2012-11-09 12:41:57

标签: java scala collections

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

E.g。在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构建类似smth的最佳做法是什么? 我认为,同样的方法(在for()中使用for())是个坏主意,并且根本不兼容Scala语言的对象功能。

1 个答案:

答案 0 :(得分:5)

我不确定最佳做法,但有一种方法可以让我们使用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)))