Может ли кто-нибудь помочь мне разобраться в этой части кода? Я пытаюсь получить некоторые файлы конфигурации из базы данных, используя класс 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));
}
Заранее спасибо!
Спасибо @zhh, но я не могу понять, как этот код превращается в итеративную инструкцию, например, для или пока? Как список возврата в findAllConfigFiles передает элемент за элементом в параметр метода вызова, а затем агрегируется в список LegalBookDescriptor взамен? Спасибо и всего наилучшего,
Я думаю, вы не понимаете flatMap, верно? stackoverflow.com/questions/26684562/…
И flatMap, и Observable. Как я отмечал в документации, flatMap преобразует массив массивов в единый массив, но где здесь массив массивов? Обратите внимание, что dataRepository.findAllConfigFiles (legalBookDescriptorsDir) возвращает Observable <ConfigFile>, а не список или массив. Спасибо и всего наилучшего,
Возможно, вам потребуется прочитать документацию по потокам rxjava или java8. Но для простоты вы можете рассматривать Observable как список или массив. На самом деле это поток данных, в вашем случае он используется просто как список данных.
Спасибо @zhh, поэтому мы можем рассматривать наблюдаемый результат как список, но как аргументы передаются для вызова как объект ConfigFile?
Аргументом flatMap является функция (интерфейс), назовем ее fun. Затем мы берем один элемент (один файл конфигурации) file в наблюдаемом (или списке) и вызываем fun.call(file), помещаем результат обратно в наблюдаемый, затем берем следующий элемент. oracle.com/technetwork/articles/java/…
Спасибо @zhh за это разъяснение, теперь я понимаю больше, большое вам спасибо! С наилучшими пожеланиями,




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