Что такое функциональный литерал в Scala? - PullRequest
43 голосов
/ 09 марта 2011

Что такое литерал функции в Scala и когда я должен их использовать?

Ответы [ 2 ]

72 голосов
/ 09 марта 2011

Литерал функции - это альтернативный синтаксис для определения функции.Это полезно, когда вы хотите передать функцию в качестве аргумента методу (особенно функции более высокого порядка, например, операции сгиба или операции фильтрации), но вы не хотите определять отдельную функцию.Функциональные литералы являются анонимными - по умолчанию они не имеют имени, но вы можете дать им имя, связав их с переменной.Функциональный литерал определяется следующим образом:

(a:Int, b:Int) => a + b

Вы можете связать их с переменными:

val add = (a:Int, b:Int) => a + b
add(1, 2) // Result is 3

Как я уже говорил, функциональные литералы полезны для передачи в качестве аргументов более высокого порядкафункции.Они также полезны для определения однострочных или вспомогательных функций, вложенных в другие функции.

Обзор Scala дает довольно хороший справочник по литералам функций (они называют их анонимными функциями).

19 голосов
/ 06 августа 2016

Может быть полезно сравнить функциональные литералы с другими типами литералов в 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...