I understand that you actually don't need the full result, but isn't this operation rather limiting? If you don't want to instantiate the result into some list, you could define an interface within the Queryable feature with size() and list() methods and wrap the CacheQuery inside.