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