|
| 1 | +--- |
| 2 | +layout: multipage-overview |
| 3 | +title: Функции первого класса |
| 4 | +scala3: true |
| 5 | +partof: scala3-book |
| 6 | +overview-name: "Scala 3 — Book" |
| 7 | +type: chapter |
| 8 | +description: На этой странице представлено введение в функции в Scala 3. |
| 9 | +language: ru |
| 10 | +num: 11 |
| 11 | +previous-page: taste-methods |
| 12 | +next-page: taste-objects |
| 13 | +--- |
| 14 | + |
| 15 | +Scala обладает большинством возможностей, которые вы ожидаете от функционального языка программирования, в том числе: |
| 16 | + |
| 17 | +- Lambdas (анонимные функции) |
| 18 | +- Функции высшего порядка (HOF) |
| 19 | +- Неизменяемые коллекции в стандартной библиотеке |
| 20 | + |
| 21 | +Лямбда-выражения, также известные как _анонимные функции_, играют важную роль в том, чтобы ваш код был кратким, но удобочитаемым. |
| 22 | + |
| 23 | +Метод `map` класса `List` является типичным примером функции высшего порядка — |
| 24 | +функции, которая принимает функцию в качестве параметра. |
| 25 | + |
| 26 | +Эти два примера эквивалентны и показывают, как умножить каждое число в списке на `2`, передав лямбда в метод `map`: |
| 27 | + |
| 28 | + |
| 29 | +{% tabs function_1 %} |
| 30 | +{% tab 'Scala 2 and 3' for=function_1 %} |
| 31 | +```scala |
| 32 | +val a = List(1, 2, 3).map(i => i * 2) // List(2,4,6) |
| 33 | +val b = List(1, 2, 3).map(_ * 2) // List(2,4,6) |
| 34 | +``` |
| 35 | +{% endtab %} |
| 36 | +{% endtabs %} |
| 37 | + |
| 38 | +Примеры выше также эквивалентны следующему коду, в котором вместо лямбда используется метод `double`: |
| 39 | + |
| 40 | + |
| 41 | +{% tabs function_2 %} |
| 42 | +{% tab 'Scala 2 and 3' for=function_2 %} |
| 43 | +```scala |
| 44 | +def double(i: Int): Int = i * 2 |
| 45 | + |
| 46 | +val a = List(1, 2, 3).map(i => double(i)) // List(2,4,6) |
| 47 | +val b = List(1, 2, 3).map(double) // List(2,4,6) |
| 48 | +``` |
| 49 | +{% endtab %} |
| 50 | +{% endtabs %} |
| 51 | + |
| 52 | +> Если вы еще раньше не видели метод `map`, он применяет заданную функцию к каждому элементу в списке, |
| 53 | +> создавая новый список, содержащий результирующие значения. |
| 54 | +
|
| 55 | +Передача лямбда-выражений функциям высшего порядка в классах коллекций (таких, как `List`) — |
| 56 | +это часть работы со Scala, которую вы будете делать каждый день. |
| 57 | + |
| 58 | + |
| 59 | +## Неизменяемые коллекции |
| 60 | + |
| 61 | +Когда вы работаете с неизменяемыми коллекциями, такими как `List`, `Vector`, |
| 62 | +а также с неизменяемыми классами `Map` и `Set`, важно знать, |
| 63 | +что эти функции не изменяют коллекцию, для которой они вызываются; |
| 64 | +вместо этого они возвращают новую коллекцию с обновленными данными. |
| 65 | +В результате также принято объединять их вместе в “свободном” стиле для решения проблем. |
| 66 | + |
| 67 | +Например, в этом примере показано, как отфильтровать коллекцию дважды, |
| 68 | +а затем умножить каждый элемент в оставшейся коллекции: |
| 69 | + |
| 70 | + |
| 71 | +{% tabs function_3 %} |
| 72 | +{% tab 'Scala 2 and 3' for=function_3 %} |
| 73 | +```scala |
| 74 | +// пример списка |
| 75 | +val nums = (1 to 10).toList // List(1,2,3,4,5,6,7,8,9,10) |
| 76 | + |
| 77 | +// методы могут быть сцеплены вместе |
| 78 | +val x = nums.filter(_ > 3) |
| 79 | + .filter(_ < 7) |
| 80 | + .map(_ * 10) |
| 81 | + |
| 82 | +// result: x == List(40, 50, 60) |
| 83 | +``` |
| 84 | +{% endtab %} |
| 85 | +{% endtabs %} |
| 86 | + |
| 87 | +В дополнение к функциям высшего порядка, используемым в стандартной библиотеке, |
| 88 | +вы также можете [создавать свои собственные функции][higher-order]. |
| 89 | + |
| 90 | +[higher-order]: {% link _overviews/scala3-book/fun-hofs.md %} |
0 commit comments