Подтвердить что ты не робот

Что такое буква функции в Scala?

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

4b9b3361

Ответ 1

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

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

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

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

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

Прогулка по Scala дает неплохую ссылку для функциональных литералов (они называют их анонимными функциями).

Ответ 2

Может быть полезно сравнить литералы функций с другими видами литералов в Scala. Литералы - это звуковой сахар для представления значений некоторых типов, которые язык считает особенно важными. Scala имеет целочисленные литералы, символьные литералы, строковые литералы и т.д. Scala рассматривает функции как значения первого класса, представляемые в исходном коде литералами функций, Эти значения функций хранятся в специальном типе функций. Например,

  • 5 - целочисленный литерал, представляющий значение в Int type
  • 'a' является символьным литералом, представляющим значение в Char type
  • (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)