Статьи

Функциональные литералы Scala

Функции являются важной частью языка Scala. Функции Scala могут иметь список параметров, а также иметь тип возвращаемого значения. Итак, первое, что сбивает с толку, в чем разница между функцией и методом? Разница в том, что метод — это просто тип функции, которая принадлежит классу, признаку или одноэлементному объекту.

Так что же хорошего в функциях в Scala? Ну, вы можете определять функции внутри функций (которые называются локальными функциями), и вы также можете иметь анонимные функции, которые можно передавать и возвращать из других функций. Этот пост о тех анонимных функциях, которые называются функциональными литералами.

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

1
List(1,2,3,4,5).filter((x: Int)=> x > 3)

В этом случае литерал функции имеет вид (x: Int)=> x > 3 Это приведет к выводу: resX: List[Int] = List(4, 5) .

=> называется « стрелка вправо » означает преобразовать вещь слева в вещь справа. Функциональный литерал в этом примере — это всего лишь одно простое утверждение (это то, чем они обычно являются), но функциональные литералы могут иметь несколько операторов в традиционном теле функции, окруженном {} . Например, мы могли бы сказать:

1
2
3
List(1,2,3,4,5).filter((x: Int)=>{
  println('x='+ x);
  x > 3;})

который дает:

1
2
3
4
5
6
x=1
x=2
x=3
x=4
x=5
resX: List[Int] = List(4, 5)

Теперь одной из ключевых особенностей Scala является возможность сделать больше с меньшим количеством кода. Итак, с этим складом ума, давайте посмотрим, как мы можем сократить наш оригинальный литерал функции. Во-первых, мы можем удалить тип параметра.

1
List(1,2,3,4,5).filter((x)=> x > 3)

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

Мы можем еще больше уменьшить нагрузку на наши пальцы, сняв скобки. Это потому, что круглые скобки были только там, чтобы показать то, что упоминалось как Int в типизации параметра. Но теперь вывод сделан, скобки излишни и могут быть удалены.

1
List(1,2,3,4,5).filter(x => x > 3)

Сократить это еще больше? да, конечно … мы можем использовать
заполнитель подчеркивает синтаксис.

1
List(1,2,3,4,5).filter(_ > 3)

Подчеркивания в Scala имеют разные значения в зависимости от контекста, в котором они используются. В этом случае, если вы достаточно взрослые, вспомните бланшистую пустую игру. Это игровое шоу состояло из предложений с пробелами в них, и участники должны были сделать предложения о том, что ушло в пробел. В этом примере функция filter заполняет пробелы значениями в списках, для которых она вызывается. Таким образом, функция фильтра является пустым участником, а список (1, 2, 3, 4, 5) — то, что функция фильтра использует для заполнения пробела.

Так что теперь наш код действительно аккуратный и короткий. В Java для достижения того же самого, это будет:

1
2
3
4
5
Iterator<Integer> it = new ArrayList<Integer>(1,2,3,4,5).iterator();
while( it.hasNext() ) {
  Integer myInt = it.next();
  if(myInt > 3) it.remove();
}

Ссылка: функциональные литералы Scala от нашего партнера по JCG Алекса Стейвли в блоге Tech Blog в Дублине .