Scala / Lists - любой способ обратиться к текущему отфильтрованному списку, чтобы получить размер текущего (не размер оригинала)

case class Book(title: String, authors: List[String], year: Int)

val books: List[Book] = List(
  Book("Structure and Interpretation of Computer Programs",
    List("Abelson, Harold", "Sussman, Gerald J."), 1984),
  Book("Principles of Compiler Design",
    List("Aho, Alfred", "Ullman, Jeffrey"), 1977),
  Book("Programming in Modula-2",
    List("Wirth, Niklaus"), 1982),
  Book("Introduction to Functional Programming",
    List("Bird, Richard"), 1988),
  Book("The Java Language Specification",
    List("Gosling, James", "Joy, Bill", "Steele, Guy",
      "Bracha, Gilad"), 1996)
)


books.filter{x => x.year % 2 == 0}
     .map(_.title.length)
     .sum / 4.toDouble

Я пытаюсь найти среднюю длину названий книг, написанных в годах, которые являются четными числами.

В этом случае я хочу иметь возможность определять 4, а не кодировать его жестко, и без использования второго значения в памяти.

Есть ли способ сказать что-то вроде "это" или "предыдущий", чтобы сослаться на длину текущего (отфильтрованного) списка - пытался Google это, но я пытаюсь сформулировать запрос для поисковой системы.

Спасибо заранее

1 ответ

Решение

Как насчет использования foldLeft с match? Может быть, немного запутанный, но вы можете использовать foldLeft чтобы сгенерировать пару с первым значением, которое будет суммой списка, а второе значение будет счетчиком длины списка, а затем используйте match для вычисления среднего (деления суммы на длину):

(books.filter{x => x.year % 2 == 0}
      .map(_.title.length)
      .foldLeft((0, 0))((x, y) => (x._1 + y, x._2 + 1)) 
      match { case(x,y) => x.toDouble/y})

# res73: Double = 35.25
Другие вопросы по тегам