Что такое функциональный литерал в Scala?
Что такое функциональный литерал в Scala и когда я должен их использовать?
2 ответа
Функциональный литерал - это альтернативный синтаксис для определения функции. Это полезно, когда вы хотите передать функцию в качестве аргумента методу (особенно функции более высокого порядка, например, сгиб или операция фильтрации), но вы не хотите определять отдельную функцию. Функциональные литералы являются анонимными - по умолчанию они не имеют имени, но вы можете дать им имя, связав их с переменной. Функциональный литерал определяется так:
(a:Int, b:Int) => a + b
Вы можете связать их с переменными:
val add = (a:Int, b:Int) => a + b
add(1, 2) // Result is 3
Как я уже говорил ранее, функциональные литералы полезны для передачи в качестве аргументов функциям более высокого порядка. Они также полезны для определения однострочных или вспомогательных функций, вложенных в другие функции.
Тур по Scala дает довольно хороший справочник по литералам функций (они называют их анонимными функциями).
Может быть полезно сравнить функциональные литералы с другими типами литералов в Scala. Литералы являются обозначением для представления значений некоторых типов, которые язык считает особенно важными. Scala имеет целочисленные литералы, символьные литералы, строковые литералы и т. Д. Scala рассматривает функции как значения первого класса, представляемые в исходном коде функциональными литералами. Эти функциональные значения населяют особый тип функции. Например,
5
целочисленный литерал, представляющий значение вInt
тип'a'
символьный литерал, представляющий значение вChar
тип(x: Int) => x + 2
является литералом функции, представляющим значение вInt => Int
тип функции
Литералы часто используются в качестве анонимных значений, то есть без привязки их к именованной переменной. Это помогает сделать программу более краткой и уместной, когда литерал не предназначен для повторного использования. Например:
List(1,2,3).filter((x: Int) => x > 2)
против
val one: Int = 1
val two: Int = 2
val three: Int = 3
val greaterThan2: (Int => Int) = (x: Int) => x > two
List(one,two,three).filter(greaterThan2)
Программирование на Scala, третье издание
8.3 ФУНКЦИИ ПЕРВОГО КЛАССА
Функциональный литерал компилируется в класс, который при создании экземпляра во время выполнения является значением функции.[2] Таким образом, различие между функциональными литералами и значениями состоит в том, что функциональные литералы существуют в исходном коде, тогда как значения функций существуют как объекты во время выполнения. Различие очень похоже на различие между классами (исходный код) и объектами (время выполнения).