Можно взять Rx. Там есть такая штука, как
BehaviorSubject. Все новые подписчики будут получать значение из "кэша". При обновлении данных все подписчики получат их.
Единственная проблема - BehaviorSubject нужно инициализировать начальными данными.
Но также в Rx есть так называемые "холодные" Observable. Там цепочка вычислений/действий не будет вызвана, пока нет подписчиков. Т.е. это та ленивость, что нужна. И скорее всего, есть способ сделать и ленивость и кэш с помощью Rx, просто я не так хорошо знаю эту либу. Но гугл должен знать.