Yesterday I faced a new, for me at least, problem when I wanted to read a file line by line into a List and transform the result to a Map.

Basically, I had a file ( from Rosalind) like the one below, a file in FASTA format.

>Tag_XXXX
string
>Tag_YYYY
string
>Tag_ZZZZ
string

A FASTA file contains a labels that starts with ‘>’ character and the associated information on the next line. So it seemed normally to use a Map instead of a List.

So, I started by reading the file in a List[String]

val lines: Option[List[String]] = {
    if (Files.exists(Paths.get(filePath))) {
      Some(Source.fromFile(filePath, "UTF-8").getLines().toList)
    } else {
      None
    }

The next step was to zip lines two by two and filter only the one that contains ‘>’

lines.get.zip(lines.get.tail).filter { case (k, _) => k.contains('>') }

in this way I obtained a list of tuples. The final step was simple because I only had to call toMap function.

Full code can be seen in this REPO.