Циклоп-реакция (я являюсь автором этой библиотеки), предоставляет класс StreamUtils для обработки потоков. Одной из функций, которые он предоставляет, является futureOperations, который обеспечивает доступ к стандартным операциям терминала Stream (а затем и к некоторым) с поворотом - поток выполняется асинхронно, а результат возвращается внутри CompletableFuture. .eg
Stream stream = Stream.of(1,2,3,4,5,6)
.map(i->i+2);
CompletableFuture> asyncResult = StreamUtils.futureOperations(stream,
Executors.newFixedThreadPool(1))
.collect(Collectors.toList());
Существует также удобный класс ReactiveSeq, который упаковывает Stream и обеспечивает те же функциональные возможности, с приятным беглым API
CompletableFuture> asyncResult = ReactiveSeq.of(1,2,3,4,5,6)
.map(i->i+2)
.futureOperations(
Executors.newFixedThreadPool(1))
.collect(Collectors.toList());
Как указал Адам циклопов -react FutureStreams предназначены для асинхронной обработки данных (путем смешивания Futures и Streams) - он особенно подходит для многопоточных операций, которые включают блокировку ввода-вывода (например, чтение файлов, выполнение вызовов db, выполнение вызовов rest и т. д. ).
Вот питонический способ написать этот цикл:
for index, obj in enumerate(objects):
# Use index, obj.
enumerate
работает с любой последовательностью, независимо от типов ее элементов. Это встроенная функция.
Изменить:
После выполнения некоторых timeit
тестов с использованием Python 2.5 я обнаружил, что enumerate
немного медленнее:
>>> timeit.Timer('for i in xrange(len(seq)): x = i + seq[i]', 'seq = range(100)').timeit()
10.322299003601074
>>> timeit.Timer('for i, e in enumerate(seq): x = i + e', 'seq = range(100)').timeit()
11.850601196289062