Я хотел бы использовать API Java Streams для создания конвейера, а затем завершить его с помощью iterator()
, но я хочу, чтобы он заранее "асинхронно" готовил X элементов.(API потоков не требуется, но предпочтительнее).
Ситуация, которую я имею:
- Наше приложение загружает данные из удаленных файлов (по сети) в базу данных
- Открытие удаленного файла (то есть синхронное выполнение конвейера для одного элемента) занимает нетривиальное время
- Я не могу открыть слишком много файлов одновременно (приводит к таймауту соединения)
- Порядок, в котором загружаются файлы, имеет значение
API-интерфейс Java Streams может создавать конвейер команд для выполнения, но, насколько мне известно, он не может удовлетворить оба вышеуказанных требования.Он может выполнять либо одно выполнение:
files.stream().map(this::convertToInputStream).iterator()
, что усугубляет первое требование.Или он может выполнять массовое выполнение:
files.stream().map(this::convertToInputStream).collect(toList())
, которое не дает второго.
Я реализовал требования, используя логику Deque<InputStream>
и Thread
, чтобы заполнить ее до определенного уровня.количество элементов, но это не красиво.Я спрашиваю, знает ли кто-нибудь о способе создания конвейеров, подобных этому (возможно, с использованием библиотек) более элегантным способом.Это казалось разумным вариантом использования Streams API.