А вот и разбор первой части! Спасибо всем, кто оставлял свои решения и мысли в комментариях. На мой взгляд, основная трудность тут состоит в том, что надо придумать исправление именно в
одну строку.
Подвох первой задачи состоит в
правиле вывода типов для тернарной операции, тип будет примитивным, из-за чего возникнет
NPE при анбоксинге
Вторая задача эксплуатирует
известную особенность функции
Math.abs - она возвращает отрицательное число для минимально возможного значения
intТретья задача сделана по мотивам
моей статьи про обработку Unicode в Java. Со строками можно работать на разных уровнях: отдельных байтов, двухбайтовых
char в Java, codepoint-ов и графем. Их не надо путать между собой
Четвертый паззлер - известный баян про
removeIf, но тут основная задача была придумать минимально рабочую починку именно в одну строку. Изначально я предполагал только вариант 1: использовать коллекцию, которая поддерживает конкурентные изменения. Но на конференции один из участников придумал вариант 2: копировать коллекцию при итерировании
Пятая задача требует понимания логики инициализации классов. Во время инициализации JVM помечает класс как инициализируемый текущим потоком. Если в этот момент другие потоки пытаются получить доступ к этому классу (полям, функциям и т.д.), они будут ждать окончания инициализации.
Здесь мы вычисляем статическое поле через parallel stream, поэтому часть работы уходит в другие потоки. Эти потоки пытаются выполнить лямбду, которая передаётся в
filter(...). Эта лямбда скомпилирована как часть класса, который сейчас инициализируется
В итоге получается дедлок: основной поток не закончит инициализацию, пока не вычислится статическое поле, а потоки не смогут сделать свою работу, пока основной поток не завершит инициализацию всего класса.
Вывод: в статической инициализации нельзя запускать логику работы инициализации, если эта работа сама зависит от инициализируемого класса. Поэтому для починки в одну строку делаем все через
.sequential()Это были первые пять задач-пазлеров, а в следующее воскресенье ждите вторую часть 😀