Конвертировать Files.walk в rxjava Flowable - PullRequest
1 голос
/ 10 июня 2019

Как конвертировать Stream<Path> s = Files.walk(root) до Flowable из rxjava? Обратите внимание, что мы не можем просто использовать Flowable.fromIterable(()->s.iterator()), потому что Files.walk throws IOException. Самый простой способ - собрать результаты из Files.walk, а затем создать Flowable из повторяемой коллекции, но это не выглядит идиоматическим способом.

1 Ответ

0 голосов
/ 19 июня 2019

Я думаю, что нашел хороший способ сделать это. Flowable.using() позволяет создать Flowable с некоторым «базовым» ресурсом. Если Files.walk() завершается неудачно с IOException, вызывается onError подписчика, и после завершения «ресурс» закрывается (в данном случае java.util.stream.Stream с путями).

import io.reactivex.Flowable;

import java.nio.file.Files;
import java.nio.file.Path;
import java.util.stream.Stream;

final Flowable<Path> pathFlowable = Flowable.using(
        () -> Files.walk(Path.of("/nofile")),
        stream -> Flowable.fromIterable(stream::iterator),
        Stream::close
);
pathFlowable.subscribe(System.out::println, t -> System.out.println("Error " + t.toString()));
...