Scala. Профессиональное программирование 2022. Одерски Мартин, Спун Лекс, Веннерс Билл, Соммерс ФрэнкО41 Scala. Профессиональное программирование. 5е изд спб. Питер, 2022. 608 с. ил. Серия Библиотека программиста
Скачать 6.24 Mb.
|
Глава 11. Трейты . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 229 11 .1 . Как работают трейты . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 229 11 .2 . Сравнение «тонких» и «толстых» интерфейсов . . . . . . . . . . . . . . . 232 11 .3 . Трейты как наращиваемые модификации . . . . . . . . . . . . . . . . . . . . 235 11 .4 . Почему не используется множественное наследование . . . . . . . . . 239 11 .5 . Параметры трейтов . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 243 Резюме . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 245 Глава 12. Пакеты, импорты и экспорты . . . . . . . . . . . . . . . . . . . . . . . . . . . 247 12 .1 . Помещение кода в пакеты . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 247 12 .2 . Краткая форма доступа к родственному коду . . . . . . . . . . . . . . . . . 249 12 .3 . Импортирование кода . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 252 12 .4 . Неявное импортирование . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 255 12 .5 . Модификаторы доступа . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 256 Приватные члены . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 256 Защищенные члены . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 257 Публичные члены . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 258 Область защиты . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 258 Видимость и объекты-компаньоны . . . . . . . . . . . . . . . . . . . . . . . 260 12 .6 . Определения верхнего уровня . . . . . . . . . . . . . . . . . . . . . . . . . . . . 261 12 .7 . Экспорты . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 262 Резюме . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 265 Глава 13. Сопоставление с образцом . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 266 13 .1 . Простой пример . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 266 case-классы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 267 Сопоставление с образцом . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 268 Сравнение match со switch . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 270 12 Оглавление 13 .2 . Разновидности паттернов . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 271 Подстановочные паттерны . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 271 Паттерны-константы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 272 Патерны-переменные . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 272 Паттерны-конструкторы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 274 Паттерны-последовательности . . . . . . . . . . . . . . . . . . . . . . . . . . 275 Паттерны-кортежи . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 276 Типизированные паттерны . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 276 Затирание типов . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 279 Привязка переменной . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 280 13 .3 . Ограждение образца . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 280 13 .4 . Наложение паттернов . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 281 13 .5 . Запечатанные классы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 283 13 .6 . Сопоставление паттерна Options . . . . . . . . . . . . . . . . . . . . . . . . . . 285 13 .7 . Паттерны повсюду . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 286 Паттерны в определениях переменных . . . . . . . . . . . . . . . . . . . 286 Последовательности вариантов в качестве частично примененных функций . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 287 Паттерны в выражениях for . . . . . . . . . . . . . . . . . . . . . . . . . . . . 290 13 .8 . Большой пример . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 291 Резюме . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 298 Глава 14. Работа со списками . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 299 14 .1 . Литералы списков . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 299 14 .2 . Тип List . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 300 14 .3 . Создание списков . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 300 14 .4 . Основные операции над списками . . . . . . . . . . . . . . . . . . . . . . . . . 301 14 .5 . Паттерны-списки . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 302 14 .6 . Методы первого порядка класса List . . . . . . . . . . . . . . . . . . . . . . . . 304 Конкатенация двух списков . . . . . . . . . . . . . . . . . . . . . . . . . . . . 304 Принцип «разделяй и властвуй» . . . . . . . . . . . . . . . . . . . . . . . . 305 Получение длины списка: length . . . . . . . . . . . . . . . . . . . . . . . . 307 Обращение к концу списка: init и last . . . . . . . . . . . . . . . . . . . . . 307 Реверсирование списков: reverse . . . . . . . . . . . . . . . . . . . . . . . . 308 Префиксы и суффиксы: drop, take и splitAt . . . . . . . . . . . . . . . . . 309 Выбор элемента: apply и indices . . . . . . . . . . . . . . . . . . . . . . . . . 310 Линеаризация списка списков: flatten . . . . . . . . . . . . . . . . . . . . . 310 Объединение списков: zip и unzip . . . . . . . . . . . . . . . . . . . . . . . . 311 Отображение списков: toString и mkString . . . . . . . . . . . . . . . . . 311 Оглавление 13 Преобразование списков: iterator, toArray, copyToArray . . . . . . . . 312 Пример: сортировка слиянием . . . . . . . . . . . . . . . . . . . . . . . . . . 313 14 .7 . Методы высшего порядка класса List . . . . . . . . . . . . . . . . . . . . . . . 315 Отображения списков: map, flatMap и foreach . . . . . . . . . . . . . . . 316 Фильтрация списков: filter, partition, find, takeWhile, dropWhile и span . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 317 Применение предикатов к спискам: forall и exists . . . . . . . . . . . . 318 Свертка списков: foldLeft и foldRight . . . . . . . . . . . . . . . . . . . . . . 319 Пример: реверсирование списков с помощью свертки . . . . . . . . 321 Сортировка списков: sortWith . . . . . . . . . . . . . . . . . . . . . . . . . . . 322 14 .8 . Методы объекта List . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 323 Создание списков из их элементов: List .apply . . . . . . . . . . . . . . . 323 Создание диапазона чисел: List .range . . . . . . . . . . . . . . . . . . . . . 323 Создание единообразных списков: List .fill . . . . . . . . . . . . . . . . . . 324 Табулирование функции: List .tabulate . . . . . . . . . . . . . . . . . . . . 324 Конкатенация нескольких списков: List .concat . . . . . . . . . . . . . . 324 14 .9 . Совместная обработка нескольких списков . . . . . . . . . . . . . . . . . . 325 14 .10 . Понимание имеющегося в Scala алгоритма вывода типов . . . . . . . 326 Резюме . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 330 Глава 15. Работа с другими коллекциями . . . . . . . . . . . . . . . . . . . . . . . . . 331 15 .1 . Последовательности . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 331 Списки . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 331 Массивы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 332 Буферы списков . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 333 Буферы массивов . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 333 Строки (реализуемые через StringOps) . . . . . . . . . . . . . . . . . . . . 334 15 .2 . Множества и отображения . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 335 Использование множеств . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 336 Применение отображений . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 338 Множества и отображения, используемые по умолчанию . . . . . . 340 Отсортированные множества и отображения . . . . . . . . . . . . . . . 341 15 .3 . Выбор между изменяемыми или неизменяемыми коллекциями . . . . 342 15 .4 . Инициализация коллекций . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 344 Преобразование в массив или список . . . . . . . . . . . . . . . . . . . . . 346 Преобразования между изменяемыми и неизменяемыми множествами и отображениями . . . . . . . . . . . . . . . . . . . . . . . . . 347 15 .5 . Кортежи . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 347 Резюме . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 349 14 Оглавление Глава 16. Изменяемые объекты . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 350 16 .1 . Что делает объект изменяемым . . . . . . . . . . . . . . . . . . . . . . . . . . . 350 16 .2 . Переназначаемые переменные и свойства . . . . . . . . . . . . . . . . . . . 352 16 .3 . Практический пример: моделирование дискретных событий . . . . . . 356 16 .4 . Язык для цифровых схем . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 357 16 .5 . API моделирования . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 360 16 .6 . Моделирование электронной логической схемы . . . . . . . . . . . . . . . 364 Класс Wire . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 365 Метод inverter . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 366 Методы andGate и orGate . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 367 Вывод симуляции . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 368 Запуск симулятора . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 368 Резюме . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 370 Глава 17. Иерархия Scala . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 372 17 .1 . Иерархия классов Scala . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 372 17 .2 . Как реализованы примитивы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 376 17 .3 . Низшие типы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 378 17 .4 . Определение собственных классов значений . . . . . . . . . . . . . . . . . 379 Уход от монокультурности типов . . . . . . . . . . . . . . . . . . . . . . . . 380 17 .5 . Типы пересечений . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 382 17 .6 . Типы объединения . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 383 17 .7 . Прозрачные трейты . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 386 Резюме . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 387 Глава 18. Параметризация типов . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 388 18 .1 . Функциональные очереди . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 388 18 .2 . Сокрытие информации . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 392 Приватные конструкторы и фабричные методы . . . . . . . . . . . . . 392 Альтернативный вариант: приватные классы . . . . . . . . . . . . . . . 393 18 .3 . Аннотации вариантности . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 394 Вариантность и массивы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 397 18 .4 . Проверка аннотаций вариантности . . . . . . . . . . . . . . . . . . . . . . . . 399 18 .5 . Нижние ограничители . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 402 18 .6 . Контравариантность . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 404 18 .7 . Верхние ограничители . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 407 Резюме . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 409 Оглавление 15 Глава 19. Перечисления . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 410 19 .1 . Перечисляемые типы данных . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 410 19 .2 . Алгебраические типы данных . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 414 19 .3 . Обобщенные ADT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 416 19 .4 . Что делает типы ADT алгебраическими . . . . . . . . . . . . . . . . . . . . . 417 Резюме . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 420 Глава 20. Абстрактные члены . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 421 20 .1 . Краткий обзор абстрактных членов . . . . . . . . . . . . . . . . . . . . . . . . 421 20 .2 . Члены-типы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 422 20 .3 . Абстрактные val-переменные . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 423 20 .4 . Абстрактные var-переменные . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 424 20 .5 . Инициализация абстрактных val-переменных . . . . . . . . . . . . . . . . . 425 Параметрические поля трейтов . . . . . . . . . . . . . . . . . . . . . . . . . 427 Ленивые val-переменные . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 428 20 .6 . Абстрактные типы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 431 20 .7 . Типы, зависящие от пути . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 434 20 .8 . Уточняющие типы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 436 20 .9 . Практический пример: работа с валютой . . . . . . . . . . . . . . . . . . . . 437 Резюме . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 446 Глава 21. Гивены . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 447 21 .1 . Как это работает . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 448 21 .2 . Параметризованные given-типы . . . . . . . . . . . . . . . . . . . . . . . . . . . 451 21 .3 . Анонимные given-экземпляры . . . . . . . . . . . . . . . . . . . . . . . . . . . . 455 21 .4 . Параметризованные given-экземпляры в виде классов типов . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 456 21 .5 . Импорт гивенов . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 459 21 .6 . Правила для контекстных параметров . . . . . . . . . . . . . . . . . . . . . . 461 21 .7 . Когда подходит сразу несколько гивенов . . . . . . . . . . . . . . . . . . . . 463 21 .8 . Отладка гивенов . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 465 Резюме . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 467 Глава 22. Методы расширения . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 468 22 .1 . Основы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 468 22 .2 . Обобщенные расширения . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 471 22 .3 . Групповые расширения . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 472 22 .4 . Использование класса типов . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 474 16 Оглавление 22 .5 . Методы расширения для заданных экземпляров . . . . . . . . . . . . . . . 477 22 .6 . Где Scala ищет методы расширения . . . . . . . . . . . . . . . . . . . . . . . . 480 Резюме . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 481 Глава 23. Классы типов . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 482 23 .1 . Зачем нужны классы типов . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 482 23 .2 . Границы контекста . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 487 23 .3 . Главные методы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 490 23 .4 . Многостороннее равенство . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 494 23 .5 . Неявные преобразования . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 499 23 .6 . Пример использования класса типов: сериализация JSON . . . . . . . 502 Резюме . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 510 Глава 24. Углубленное изучение коллекций . . . . . . . . . . . . . . . . . . . . . . . . 511 24 .1 . Изменяемые и неизменяемые коллекции . . . . . . . . . . . . . . . . . . . . 513 24 .2 . Согласованность коллекций . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 514 24 .3 . Трейт Iterable . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 516 Подкатегории Iterable . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 523 24 .4 . Трейты последовательностей Seq, IndexedSeq и LinearSeq . . . . . . . 523 Буферы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 528 24 .5 . Множества . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 530 24 .6 . Отображения . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 534 24 .7 . Конкретные классы неизменяемых коллекций . . . . . . . . . . . . . . . . 538 Списки . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 539 Ленивые списки . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 539 Неизменяемые ArraySeq . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 540 Векторы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 541 Неизменяемые очереди . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 542 Диапазоны . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 543 Сжатые коллекции HAMT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 543 Красно-черные деревья . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 544 Неизменяемые битовые множества . . . . . . . . . . . . . . . . . . . . . . 544 Векторные отображения . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 545 Списочные отображения . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 545 24 .8 . Конкретные классы изменяемых коллекций . . . . . . . . . . . . . . . . . . 546 Буферы массивов . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 546 Буферы списков . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 546 Построители строк . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 547 Оглавление 17 ArrayDeque . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 547 Очереди . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 547 Стеки . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 548 Изменяемые ArraySeq . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 548 Хеш-таблицы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 548 Слабые хеш-отображения . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 549 Совместно используемые отображения . . . . . . . . . . . . . . . . . . . 550 Изменяемые битовые множества . . . . . . . . . . . . . . . . . . . . . . . . 550 24 .9 . Массивы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 551 24 .10 . Строки . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 555 24 .11 . Характеристики производительности . . . . . . . . . . . . . . . . . . . . . . 556 24 .12 . Равенство . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 558 24 .13 . Представления . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 559 24 .14 . Итераторы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 563 Буферизованные итераторы . . . . . . . . . . . . . . . . . . . . . . . . . . . . 570 24 .15 . Создание коллекций с нуля . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 571 24 .16 . Преобразования между коллекциями Java и Scala . . . . . . . . . . . . . 573 Резюме . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 575 |