Реактор проекта: достижение картографического ввода Mono условно - PullRequest
1 голос
/ 17 января 2020

Я пытаюсь реализовать следующие простые императивные логики c:

boolean saveImperative(final List list) {
    final String existingList = readByNameImperative(list.getName());
    if (Objects.isNull(existingList)) {
        templateSaveImperative(existingList);
        return true;
    } else {
        templateSaveImperative(existingList);
        return false;
    }
}

, используя Project Reactor декларативным способом, и это то, чего я смог достичь:

@Test
public void testDeclarative() {
    final Mono<List> list = createList("foo");
    final Boolean result = save(list).block();
    System.out.println(result);
}

private Mono<Boolean> save(final Mono<List> listMono) {
    final Mono<List> existingListMono = listMono.cache()
            .flatMap(list -> readByName(list.getName()));
    // if
    final Mono<List> savedListMono = existingListMono
            .flatMap(existingList -> templateSave(Mono.just(existingList)));
    final Mono<Boolean> trueResult = savedListMono.map(x -> true);

    // else
    return trueResult.switchIfEmpty(templateSave(existingListMono).map(x -> false));
}

private Mono<List> templateSave(final Mono<List> listMono) {
    return listMono.map(list -> {
        System.out.println("templateSave has been called");
        return list;
    });
}

private Mono<List> readByName(final String listName) {
    if (listName != "list001") {
        return Mono.empty();
    }

    return createList(listName);
}

private Mono<List> createList(final String name) {
    final List list = List.builder().name(name).build();
    return Mono.just(list);
}

@Value
@Builder
private static class List {
    private final String name;
}

Если я выполню тест с list001, он напечатает:

templateSave has been called
true

, как и ожидалось, но если я вызову его с foo, то получу

null

Что Я бы пропал? Я ожидаю, что в этом случае будет вывод:

templateSave has been called
false

.

1 Ответ

0 голосов
/ 18 января 2020
final Mono<List> existingListMono = listMono.cache()
    .flatMap(list -> readByName(list.getName()));

... в вашем методе сохранения возьмете ваш существующий список и отобразите его с помощью readByName().

Ваш метод readByName() следующий:

private Mono<List> readByName(final String listName) {
    if (listName != "list001") {
        return Mono.empty();
    }

    return createList(listName);
}

(я не верю, что это связано с этой проблемой, но не используйте == или! = Для сравнения строк .)

Поскольку ваш listName равен foo , а не list001, он возвращает пустой Mono - таким образом, existingListMono становится пустым моно, и, как следствие, также savedListMono и trueResult.

Когда вы вызываете ваш оператор switchIfEmpty() однако вы передаете templateSave(existingListMono) - и поскольку existingListMono является пустым Mono, как указано выше, метод save() возвращает пустое Mono.

... и когда вы блокируете на пусто Mono вы получите ноль - отсюда и результат.

Таким образом, вы можете sh использовать listMono вместо existingListMono в выражении возврата в методе save(), который даст вам результат, который вы после:

trueResult.switchIfEmpty(templateSave(listMono).map(x -> false))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...