💡 Инструкция: Выберите один ответ из пяти. На 20 вопросов отведено 55 минут. В каждом задании верен только один вариант. После завершения будут показаны общий результат и 4 тематических шкал.
Вопрос 1 из 20
Что выведет или вернёт код в «Агрегирование groupingBy»?
Kotlin Группировка · Агрегирование groupingBy Копировать
// Проследите фактическое выполнение без изменения кода.
fun main() {
val words = listOf("a", "bb", "c", "ddd")
val counts = words.groupingBy { it.length }.eachCount()
println(counts.toSortedMap())
}
Будет выведено `{1=[a, c], 2=[bb], 3=[ddd]}`, поскольку `eachCount` не меняет значения групп.
Код не компилируется: `eachCount` работает только с числами.
Будет выведено `{1=2, 2=1, 3=1}`: элементы сгруппированы по длине, затем подсчитаны.
Будет выведено `{1=1, 2=1, 3=1}`, потому что одинаковые ключи перезаписываются.
Будет выведено `{a=1, bb=2, c=1, ddd=3}`.
Вопрос 4 из 20
Команда собирается использовать Sequence, когда раннее завершение или длинная цепочка действительно сокращают работу, а не по привычке. Что придётся учитывать после внедрения в «Ленивая бесконечная Sequence»?
Главный риск формулируют так: Код не компилируется: `take` нельзя применять к бесконечной Sequence.
Граница полезности решения описывается условием: Лямбда выполнится три раза, но получится `[1, 2, 3]`, поскольку `map` только наблюдает значения.
После правки останется ограничение: Лямбда выполнится бесконечно, потому что исходная последовательность не имеет конца.
Ленивость экономит промежуточные коллекции, но добавляет накладные вызовы и может быть медленнее на коротких наборах.
Главная цена решения — необходимость учитывать, что лямбда выполнится один раз, получится `[2]`, так как Sequence кэширует первый элемент.
Вопрос 7 из 20
Сколько раз выполнится лямбда `map` и какой список получится?
Kotlin Последовательности · Ленивая бесконечная Sequence Копировать
// Проследите фактическое выполнение без изменения кода.
fun main() {
val result = generateSequence(1) { it + 1 }
.map { println("map $it"); it * 2 }
.take(3)
.toList()
println(result)
}
Лямбда выполнится один раз, получится `[2]`, так как Sequence кэширует первый элемент.
Лямбда выполнится три раза, получится `[2, 4, 6]`: Sequence лениво производит только затребованные элементы.
Лямбда выполнится бесконечно, потому что исходная последовательность не имеет конца.
Лямбда выполнится три раза, но получится `[1, 2, 3]`, поскольку `map` только наблюдает значения.
Код не компилируется: `take` нельзя применять к бесконечной Sequence.
Вопрос 8 из 20
Какой контракт определяет наблюдаемый результат «Агрегирование groupingBy»?
Kotlin Группировка · Агрегирование groupingBy Копировать
// На ревью требуется объяснить причину поведения.
fun main() {
val words = listOf("a", "bb", "c", "ddd")
val counts = words.groupingBy { it.length }.eachCount()
println(counts.toSortedMap())
}
Наблюдаемое поведение выводят из того, что код не компилируется: `eachCount` работает только с числами.
Ключевым считают контракт: Будет выведено `{1=[a, c], 2=[bb], 3=[ddd]}`, поскольку `eachCount` не меняет значения групп.
Причину поведения формулируют так: Будет выведено `{a=1, bb=2, c=1, ddd=3}`.
Объяснение опирается на утверждение: Будет выведено `{1=1, 2=1, 3=1}`, потому что одинаковые ключи перезаписываются.
`groupBy` сразу создаёт списки значений, а `groupingBy` поддерживает отложенное агрегирование вроде `eachCount` и `fold`.
Вопрос 9 из 20
Что появится в выводе примера «Порядок filter и map»?
Kotlin map и filter · Порядок filter и map Копировать
// Проследите фактическое выполнение без изменения кода.
fun main() {
val result = listOf(1, 2, 3, 4)
.filter { it % 2 == 0 }
.map { it * it }
println(result)
}
Будет выведен `[4, 16]`: сначала остаются чётные элементы, затем каждый из них возводится в квадрат.
Код не компилируется: `filter` доступен только для MutableList.
Будет выведен `[1, 9]`, поскольку фильтр применяется после преобразования.
Будет выведен `[4]`, так как цепочка останавливается после первого совпадения.
Будет выведен `[2, 4]`, потому что `map` не меняет значения.
Вопрос 11 из 20
Какую точечную правку стоит принять на ревью фрагмента «Агрегирование groupingBy»?
Kotlin Группировка · Агрегирование groupingBy Копировать
// Сохраните назначение фрагмента, но укрепите его контракт.
fun main() {
val words = listOf("a", "bb", "c", "ddd")
val counts = words.groupingBy { it.length }.eachCount()
println(counts.toSortedMap())
}
Передать ответственность владельцу вызова, предполагая, что будет выведено `{1=[a, c], 2=[bb], 3=[ddd]}`, поскольку `eachCount` не меняет значения групп.
Выбирать агрегирование без списков, если нужны только количества или сводные значения, особенно на больших данных.
Оставить структуру прежней, документировав утверждение: Будет выведено `{1=1, 2=1, 3=1}`, потому что одинаковые ключи перезаписываются.
Обернуть операцию проверкой и не менять основной контракт: Код не компилируется: `eachCount` работает только с числами.
Оставить реализацию без изменений и закрепить тестом предположение: Будет выведено `{a=1, bb=2, c=1, ddd=3}`.
Вопрос 13 из 20
Что следует изменить прежде всего во фрагменте «Ленивая бесконечная Sequence»?
Kotlin Последовательности · Ленивая бесконечная Sequence Копировать
// Сохраните назначение фрагмента, но укрепите его контракт.
fun main() {
val result = generateSequence(1) { it + 1 }
.map { println("map $it"); it * 2 }
.take(3)
.toList()
println(result)
}
Использовать Sequence, когда раннее завершение или длинная цепочка действительно сокращают работу, а не по привычке.
Оставить структуру прежней, документировав утверждение: Лямбда выполнится бесконечно, потому что исходная последовательность не имеет конца.
Передать ответственность владельцу вызова, предполагая, что лямбда выполнится три раза, но получится `[1, 2, 3]`, поскольку `map` только наблюдает значения.
Обернуть операцию проверкой и не менять основной контракт: Лямбда выполнится один раз, получится `[2]`, так как Sequence кэширует первый элемент.
Добавить локальную обработку результата, потому что код не компилируется: `take` нельзя применять к бесконечной Sequence.
Вопрос 14 из 20
Где поведение «Агрегирование groupingBy» требует отдельной проверки?
Добавить тест на состояние, при котором будет выведено `{1=1, 2=1, 3=1}`, потому что одинаковые ключи перезаписываются.
Проверить границу полезности утверждения: Будет выведено `{a=1, bb=2, c=1, ddd=3}`.
Отдельно проверить предположение, что будет выведено `{1=[a, c], 2=[bb], 3=[ddd]}`, поскольку `eachCount` не меняет значения групп.
Порядок ключей обычной Map не следует использовать как бизнес-контракт; для вывода нужна явная сортировка или подходящая реализация.
Проверить соседний случай: Код не компилируется: `eachCount` работает только с числами.
Вопрос 17 из 20
Какое ограничение сохранится после правки «Агрегирование groupingBy»: Выбирать агрегирование без списков, если нужны только количества или сводные значения, особенно на больших данных?
Решение оправдано лишь при условии: Будет выведено `{1=[a, c], 2=[bb], 3=[ddd]}`, поскольку `eachCount` не меняет значения групп.
Готовые операции группировки уменьшают ручной код, но создание списков в каждой группе может быть заметно дороже точечного агрегата.
Цена упрощения проявится, если будет выведено `{a=1, bb=2, c=1, ddd=3}`.
Практическое ограничение подхода: Будет выведено `{1=1, 2=1, 3=1}`, потому что одинаковые ключи перезаписываются.
Новый риск связан с тем, что код не компилируется: `eachCount` работает только с числами.
Вопрос 19 из 20
Какая небольшая правка заметно повышает надёжность «Порядок filter и map»?
Kotlin map и filter · Порядок filter и map Копировать
// Сохраните назначение фрагмента, но укрепите его контракт.
fun main() {
val result = listOf(1, 2, 3, 4)
.filter { it % 2 == 0 }
.map { it * it }
println(result)
}
Сохранять ясную цепочку для небольших данных, а при больших объёмах измерить пользу `Sequence` или одного ручного прохода.
Обернуть операцию проверкой и не менять основной контракт: Будет выведен `[2, 4]`, потому что `map` не меняет значения.
Передать ответственность владельцу вызова, предполагая, что будет выведен `[1, 9]`, поскольку фильтр применяется после преобразования.
Зафиксировать текущее поведение регрессионным тестом: Будет выведен `[4]`, так как цепочка останавливается после первого совпадения.
Добавить локальную обработку результата, потому что код не компилируется: `filter` доступен только для MutableList.
Вопрос 20 из 20
Какой редкий случай способен сломать наивную трактовку «Ленивая бесконечная Sequence»?
Отдельно воспроизвести случай, в котором лямбда выполнится три раза, но получится `[1, 2, 3]`, поскольку `map` только наблюдает значения.
Добавить граничный тест на утверждение: Лямбда выполнится один раз, получится `[2]`, так как Sequence кэширует первый элемент.
Проверить, сохраняется ли контракт, когда лямбда выполнится бесконечно, потому что исходная последовательность не имеет конца.
Повторная терминальная операция обычно повторно выполняет весь конвейер; Sequence не обязана кэшировать значения.
Воспроизвести редкий сценарий, где код не компилируется: `take` нельзя применять к бесконечной Sequence.