Курс Scala 2022. Лекция 2. Работа со списками

preview_player
Показать описание

Содержание:

00:00 Приветствие и обзор лекции
00:55 Почему List?
03:20 Функциональный подход и иммутабельность
10:37 Персистентные структуры данных
12:36 Устройство List
20:37 Рекурсивный обход списка
22:20 Хвостовая рекурсия
27:25 Получение элемента по индексу
29:04 Добавление в хвост списка
31:49 filter и его реализация
35:57 map, flatten, flatMap и collect
39:58 foldLeft
45:22 ListBuffer и builder'ы
50:04 NonEmptyList
53:42 map, filter и flatMap у Option
Рекомендации по теме
Комментарии
Автор

А какие методы работы с неизменяемыми структурами данных вы считаете наиболее эффективными? я сам недавно закончил универ и понял, что моя специальность мне не подходит, поэтому пошел на курсы Skypro и теперь работаю веб-дизайнером))

TeuvoLaaksonen
Автор

48:57
Вариант хвостовой рекурсии:

def filter(list: List[Int], pred: Int => Boolean, acc: ListBuffer[Int] = ListBuffer[Int]()): List[Int] =
if (list.isEmpty) acc.toList
else {if (pred(list.head))
filter(list.tail, pred, acc += list.head)
else filter(list.tail, pred, acc)}

andrefimenko
Автор

Отличные лекции! Все круто! Только в хвостовой рекурсии в условии n должен быть больше 1, а не 0)

Dimon-pokemon
Автор

44:21

val shortList = List(1, 2, 2, 3, 2, 4, 6, 5, 5, 10, 1)

def count(list: List[Int], f: Int => Boolean): Int =
list.filter(f).length

println(count(shortList, x => x > 4 && x < 10))

Что бы запустить эту неэффективную функцию нужно подать в неё и предикат, в моём случае x > 4 && x < 10.
Вопрос: как можно создать переменную, что бы она и была предикатом?
Типа того, но не работает val pred = {x > 4 && x < 10}

andrefimenko
Автор

37:06

polymorphic expression cannot be instantiated to expected type;

found : [A](=> A) => List[A]
required: Int => ?


Это выдаёт IDEA.
Почему у меня не работает укороченный синтаксис, а (x => List.... и т.д. норм?

andrefimenko