Я не смог воспроизвести переполнение стека, но вот что происходит:
override def filterKeys(p: A => Boolean): Map[A, B] = new DefaultMap[A, B] {
override def foreach[C](f: ((A, B)) => C): Unit = for (kv <- self) if (p(kv._1)) f(kv)
def iterator = self.iterator.filter(kv => p(kv._1))
override def contains(key: A) = self.contains(key) && p(key)
def get(key: A) = if (!p(key)) None else self.get(key)
}
Обратите внимание, что копирование значений не выполняется: новый класс просто добавляет правила к четырем методам, которые изменят их работу в зависимости от добавленного вами фильтра. Поскольку вы неоднократно применяете filterKeys
(10000 раз), это означает, что у вас есть 10000 классов, каждый из которых указывает на предыдущий, а первый указывает на исходную карту.
Вызов одного из вышеперечисленных методов (прямо или косвенно) в конечном классе, следовательно, вызовет 10000 вложенных методов, что, безусловно, может привести к переполнению стека, если ваш стек достаточно мал.