Н
Size: a a a
Н
7а
QH
7а
NK
ConcurrentModificationException, но этого мало: нельзя уведомлять отписавшихся, нужно удалять сразу;val nProp = propertyOf(0)Функция
val facProp = nProp.map(::factorial)
repeat(100500) { nProp.value = it }
factorial вызовется ноль раз, ведь никто не подписан на facProp и не запрашивал значение. То есть проперти всегда знает, смотрят ли на него или можно расслабиться.LazyView — эдакий ViewStub для вёрстки из кода:addView(Дальше происходит следующее:
lazyView(visibleProp) {
mySuperHeavyView()
}
)
true в какое-то проперти;visibleProp зависит от него через серию всяких map и тоже становится true (а мы прямо сейчас уведомляем подписчиков об изменении);LazyView выпиливается из контейнера, отписывается от visibleProp, создаёт superHeavyView и подписывает его на ту же visibleProp;A
NK

WR
G
NK

NK
char — два байта, а .charAt работает за константное время. Но количество символов в Юникоде уже перевалило за миллион, а это чуть больше, чем 65к, поэтому не все символы вмещаются в два байта. В итоге char содержит обман в своём названии, так как может оказаться половинкой длинного символа («суррогатной пары»), .length() иногда привирает, а за константное время можно получить только немного самообмана.int. В классе Character у большинства методов есть оверлоады для char и int.CharSequence есть метод .codePoints(), который возвращает IntStream. Так, количество кодпоинтов можно посчитать за линейное время, вызвав .codePoints().count().NK
for (int i : range(0, 10)) {i финальная в теле цикла, её нельзя случайно перезаписать и можно безнаказанно захватывать.IntStream.range(0, 10).forEach(, потому что здесь продолжают работать continue и break.Н
QH
Н
NK

ИЗ

QH
ES

I
