|
| 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: 13 |
| 11 | +previous-page: taste-objects |
| 12 | +next-page: taste-contextual-abstractions |
| 13 | +--- |
| 14 | + |
| 15 | + |
| 16 | +Библиотека Scala поставляется с богатым набором классов коллекций, и эти классы содержат множество методов. |
| 17 | +Классы коллекций доступны как в неизменяемой, так и в изменяемой форме. |
| 18 | + |
| 19 | +## Создание списков |
| 20 | + |
| 21 | +Чтобы дать вам представление о том, как они работают, вот несколько примеров, в которых используется класс `List`, |
| 22 | +являющийся неизменяемым классом связанного списка. |
| 23 | +В этих примерах показаны различные способы создания заполненного `List`: |
| 24 | + |
| 25 | +{% tabs collection_1 %} |
| 26 | +{% tab 'Scala 2 and 3' for=collection_1 %} |
| 27 | + |
| 28 | +```scala |
| 29 | +val a = List(1, 2, 3) // a: List[Int] = List(1, 2, 3) |
| 30 | + |
| 31 | +// методы Range |
| 32 | +val b = (1 to 5).toList // b: List[Int] = List(1, 2, 3, 4, 5) |
| 33 | +val c = (1 to 10 by 2).toList // c: List[Int] = List(1, 3, 5, 7, 9) |
| 34 | +val e = (1 until 5).toList // e: List[Int] = List(1, 2, 3, 4) |
| 35 | +val f = List.range(1, 5) // f: List[Int] = List(1, 2, 3, 4) |
| 36 | +val g = List.range(1, 10, 3) // g: List[Int] = List(1, 4, 7) |
| 37 | +``` |
| 38 | + |
| 39 | +{% endtab %} |
| 40 | +{% endtabs %} |
| 41 | + |
| 42 | +## Методы `List` |
| 43 | + |
| 44 | +В следующих примерах показаны некоторые методы, которые можно вызывать для заполненного списка. |
| 45 | +Обратите внимание, что все эти методы являются функциональными, |
| 46 | +а это означает, что они не изменяют коллекцию, на которой вызываются, |
| 47 | +а вместо этого возвращают новую коллекцию с обновленными элементами. |
| 48 | +Результат, возвращаемый каждым выражением, отображается в комментарии к каждой строке: |
| 49 | + |
| 50 | +{% tabs collection_2 %} |
| 51 | +{% tab 'Scala 2 and 3' for=collection_2 %} |
| 52 | + |
| 53 | +```scala |
| 54 | +// a sample list |
| 55 | +val a = List(10, 20, 30, 40, 10) // List(10, 20, 30, 40, 10) |
| 56 | + |
| 57 | +a.drop(2) // List(30, 40, 10) |
| 58 | +a.dropWhile(_ < 25) // List(30, 40, 10) |
| 59 | +a.filter(_ < 25) // List(10, 20, 10) |
| 60 | +a.slice(2,4) // List(30, 40) |
| 61 | +a.tail // List(20, 30, 40, 10) |
| 62 | +a.take(3) // List(10, 20, 30) |
| 63 | +a.takeWhile(_ < 30) // List(10, 20) |
| 64 | + |
| 65 | +// flatten |
| 66 | +val a = List(List(1,2), List(3,4)) |
| 67 | +a.flatten // List(1, 2, 3, 4) |
| 68 | + |
| 69 | +// map, flatMap |
| 70 | +val nums = List("one", "two") |
| 71 | +nums.map(_.toUpperCase) // List("ONE", "TWO") |
| 72 | +nums.flatMap(_.toUpperCase) // List('O', 'N', 'E', 'T', 'W', 'O') |
| 73 | +``` |
| 74 | + |
| 75 | +{% endtab %} |
| 76 | +{% endtabs %} |
| 77 | + |
| 78 | +Эти примеры показывают, как методы “foldLeft” и “reduceLeft” используются |
| 79 | +для суммирования значений в последовательности целых чисел: |
| 80 | + |
| 81 | +{% tabs collection_3 %} |
| 82 | +{% tab 'Scala 2 and 3' for=collection_3 %} |
| 83 | + |
| 84 | +```scala |
| 85 | +val firstTen = (1 to 10).toList // List(1, 2, 3, 4, 5, 6, 7, 8, 9, 10) |
| 86 | + |
| 87 | +firstTen.reduceLeft(_ + _) // 55 |
| 88 | +firstTen.foldLeft(100)(_ + _) // 155 (100 является “начальным” значением) |
| 89 | +``` |
| 90 | + |
| 91 | +{% endtab %} |
| 92 | +{% endtabs %} |
| 93 | + |
| 94 | +Для классов коллекций Scala доступно гораздо больше методов, |
| 95 | +и они продемонстрированы в главе ["Коллекции"][collections] и в [API документации][api]. |
| 96 | + |
| 97 | +## Кортежи |
| 98 | + |
| 99 | +В Scala _кортеж_ (_tuple_) — это тип, позволяющий легко поместить набор различных типов в один и тот же контейнер. |
| 100 | +Например, используя данный case класс `Person`: |
| 101 | + |
| 102 | +{% tabs collection_4 %} |
| 103 | +{% tab 'Scala 2 and 3' for=collection_4 %} |
| 104 | + |
| 105 | +```scala |
| 106 | +case class Person(name: String) |
| 107 | +``` |
| 108 | + |
| 109 | +{% endtab %} |
| 110 | +{% endtabs %} |
| 111 | + |
| 112 | +Вот как вы создаете кортеж, который содержит `Int`, `String` и пользовательское значение `Person`: |
| 113 | + |
| 114 | +{% tabs collection_5 %} |
| 115 | +{% tab 'Scala 2 and 3' for=collection_5 %} |
| 116 | + |
| 117 | +```scala |
| 118 | +val t = (11, "eleven", Person("Eleven")) |
| 119 | +``` |
| 120 | + |
| 121 | +{% endtab %} |
| 122 | +{% endtabs %} |
| 123 | + |
| 124 | +Когда у вас есть кортеж, вы можете получить доступ к его значениям, привязав их к переменным, |
| 125 | +или получить к ним доступ по номеру: |
| 126 | + |
| 127 | +{% tabs collection_6 %} |
| 128 | +{% tab 'Scala 2 and 3' for=collection_6 %} |
| 129 | + |
| 130 | +```scala |
| 131 | +t(0) // 11 |
| 132 | +t(1) // "eleven" |
| 133 | +t(2) // Person("Eleven") |
| 134 | +``` |
| 135 | + |
| 136 | +{% endtab %} |
| 137 | +{% endtabs %} |
| 138 | + |
| 139 | +Вы также можете использовать этот метод _извлечения_, чтобы присвоить поля кортежа именам переменных: |
| 140 | + |
| 141 | +{% tabs collection_7 %} |
| 142 | +{% tab 'Scala 2 and 3' for=collection_7 %} |
| 143 | + |
| 144 | +```scala |
| 145 | +val (num, str, person) = t |
| 146 | + |
| 147 | +// в результате: |
| 148 | +// val num: Int = 11 |
| 149 | +// val str: String = eleven |
| 150 | +// val person: Person = Person(Eleven) |
| 151 | +``` |
| 152 | + |
| 153 | +{% endtab %} |
| 154 | +{% endtabs %} |
| 155 | + |
| 156 | +Кортежи хороши в тех случаях, когда вы хотите поместить коллекцию разнородных типов в небольшую структуру, похожую на коллекцию. |
| 157 | +Дополнительные сведения о кортежах см. ["в справочной документации"][reference]. |
| 158 | + |
| 159 | +[collections]: {% link _overviews/scala3-book/collections-intro.md %} |
| 160 | +[api]: https://scala-lang.org/api/3.x/ |
| 161 | +[reference]: {{ site.scala3ref }}/overview.html |
0 commit comments