Н
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