映射Scala中的元组列表

时间:2017-03-09 01:13:30

标签: scala

尝试映射元组列表时出现编译错误。我有一个返回Future[List[(String, String)]]的方法,我需要使用这两组String值来调用另一个方法

def myHelper(): Future[List[(String, String)]] = { ... }

def myWork() = {
  myHelper() map {
    case(firstVal, secondVal) => otherWork(firstVal, secondVal)
  }
} 

我得到的错误是

found: (T1, T2)
required: List[(String, String)]

有什么建议吗?

修改 嗯....我不清楚我的问题。 otherWork期望所有结果的列表

def otherWork(firstVals: List[String], secondVals: List[Strong]) = { ... }

2 个答案:

答案 0 :(得分:2)

取决于你想做什么。

在每个元组上调用otherWork

def myWork() = {
    myHelper().map(_.map {
        case (firstVal, secondVal) => otherWork(firstVal, secondVal)
    })
}

如果otherWork: (String, String) => T,则myWork: () => Future[List[T]]

如果otherWork: (String, String) => Future[T]并且您想要全部运行它们并收集结果,那么您可以使用类似

的内容
def myWork() = {
    myHelper() flatMap { list => Future.sequence(
        list map { case (firstVal, secondVal) =>
            otherWork(firstVal, secondVal)
        })
    }
}

问题澄清后,您需要unzip

def myWork() = {
    myHelper() map { list =>
        list.unzip match {
            case (firstVals, secondVals) => otherWork(firstVals, secondVals)
        }
    }
}

Federico Pellegatta的答案有一个较短的写作形式。

答案 1 :(得分:2)

让我们将myWork函数实现为:

def myWork = myHelper.map {
  helper => (otherWork _).tupled(helper.unzip)
}