Использование flatMap с Observable в JAVA

Может ли кто-нибудь помочь мне разобраться в этой части кода? Я пытаюсь получить некоторые файлы конфигурации из базы данных, используя класс dataRepository, который возвращает Observable из файлов конфигурации в специальной форме (он был разработан другим разработчиком)

final List<LegalBookDescriptor> legalBookDescriptors = dataRepository.findAllConfigFiles(legalBookDescriptorsDir)
        .flatMap(new Func1<ConfigFile, Observable<LegalBookDescriptor>>() {
            @Override
            public Observable<LegalBookDescriptor> call(ConfigFile configFile) {
                try {
                    final LegalBookDescriptor legalBookDescriptor = conversionService.convert(configFile.getContent(), LegalBookDescriptor.class);

                    LOG.info(String.format("Successfully loaded [Legal Book Descriptor] from file [%s]", configFile.getPath()));

                    return Observable.just(legalBookDescriptor);
                } catch (Exception e) {
                    LOG.error(String.format("Failed to load [Legal Book Descriptor] from file [%s]", configFile.getPath()), e);

                    return Observable.empty();
                }
            }
        })
        .toList()
        .toBlocking()
        .single();

if (legalBookDescriptors.isEmpty()) {
    LOG.warn(String.format("Hasn't found any valid Legal Book Descriptor file in the root directory [%s].", legalBookDescriptorsDir));
}

Заранее спасибо!

Код пытается преобразовать список ConfigFile в список LegalBookDescriptor и оставить недействительный файл конфигурации.

zhh 23.07.2018 17:27

Спасибо @zhh, но я не могу понять, как этот код превращается в итеративную инструкцию, например, для или пока? Как список возврата в findAllConfigFiles передает элемент за элементом в параметр метода вызова, а затем агрегируется в список LegalBookDescriptor взамен? Спасибо и всего наилучшего,

ESSABRI 23.07.2018 17:40

Я думаю, вы не понимаете flatMap, верно? stackoverflow.com/questions/26684562/…

zhh 23.07.2018 17:43

И flatMap, и Observable. Как я отмечал в документации, flatMap преобразует массив массивов в единый массив, но где здесь массив массивов? Обратите внимание, что dataRepository.findAllConfigFiles (legalBookDescriptorsDir) возвращает Observable <ConfigFile>, а не список или массив. Спасибо и всего наилучшего,

ESSABRI 23.07.2018 17:47

Возможно, вам потребуется прочитать документацию по потокам rxjava или java8. Но для простоты вы можете рассматривать Observable как список или массив. На самом деле это поток данных, в вашем случае он используется просто как список данных.

zhh 23.07.2018 17:52

Спасибо @zhh, поэтому мы можем рассматривать наблюдаемый результат как список, но как аргументы передаются для вызова как объект ConfigFile?

ESSABRI 23.07.2018 18:06

Аргументом flatMap является функция (интерфейс), назовем ее fun. Затем мы берем один элемент (один файл конфигурации) file в наблюдаемом (или списке) и вызываем fun.call(file), помещаем результат обратно в наблюдаемый, затем берем следующий элемент. oracle.com/technetwork/articles/java/…

zhh 23.07.2018 18:13

Спасибо @zhh за это разъяснение, теперь я понимаю больше, большое вам спасибо! С наилучшими пожеланиями,

ESSABRI 23.07.2018 18:50
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
8
93
0

Другие вопросы по теме