有没有更好的方式来匹配和解构元组,而丢弃其余的呢?

问题描述

我刚进入Scala几个星期,就发现它既有趣又令人生畏。我试图从空间限定的4列文本文件中解构出两个元组。我想匹配(但不保留)第一列,删除最后一列,同时保留中间两列(文章,请求)。

  val filteredPairs = bufferedSource.getLines().toList map { line =>
    line.trim.split("\\s+").toList

    match {
      case List("en",article,requests,_) => (article,requests)
      case _ => None
    }
  } filter { m => m != None }

我也尝试过返回“ case _ =>”,在hashrocket和接收Unit()之后没有任何输入。我在摆弄地图和平面地图,但是在类型匹配方面遇到了问题。也许我在某处需要一个Option,但是我有一个截止日期,这两个解决方案都对我有用,所以我现在就继续前进,但是我想找到一个更优雅的解决方案。谢谢。

解决方法

您可以使用collect,类似于filter + map。我经常说scaladoc是你的朋友。
(顺便说一句,您可以将toList转换移到最后,以利用getLines返回的 Iterator

val filteredPairs =
  bufferedSource
    .getLines()
    .map(line => line.trim.split("\\s+").toList)
    .collect {
      // If it has more than four columns,this won't match.
      case "en" :: article :: requests :: _ :: Nil => (article,requests)
    }.toList