Что такое функциональный литерал в 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] Таким образом, различие между функциональными литералами и значениями состоит в том, что функциональные литералы существуют в исходном коде, тогда как значения функций существуют как объекты во время выполнения. Различие очень похоже на различие между классами (исходный код) и объектами (время выполнения).

Другие вопросы по тегам