Необязательный ifPresent, в противном случае вызовите другую функцию - PullRequest
0 голосов
/ 10 января 2020

Я написал код, который работает, однако мне пришлось создавать дополнительные строки, есть ли способ сжать это в одну строку? Логика c: взять последнюю страницу, выполнить поиск по регулярному выражению, если не найдено, перейти на предыдущую страницу и выполнить поиск по регулярному выражению

Optional<String> totalBoxesLastPage = lastPage.locate(INVOICE_TOTAL_AMOUNT_BOXES);
    Optional<String> totalBoxes = totalBoxesLastPage.isPresent() ? 
                                      totalBoxesLastPage : nextToLastPage
                                     .flatMap(p -> p.locate(INVOICE_TOTAL_AMOUNT_BOXES));

Спасибо, ребята

Ответы [ 2 ]

3 голосов
/ 10 января 2020

Вы можете использовать orElseGet с поставщиком для вызова некоторой функции, которая вычисляет значение, если необязательный параметр пуст. Если значение присутствует, оно возвращает значение, в противном случае возвращает результат, полученный функцией-поставщиком. В вашем случае вы должны пройти Supplier<String>. Более того, тип возврата после распаковки Optional должен быть String, а не Optional<String>.

String totalBoxes = totalBoxesLastPage
    .orElseGet(() -> nextToLastPage.flatMap(p -> p.locate(INVOICE_TOTAL_AMOUNT_BOXES))
        .orElseThrow(IllegalStateException::new));
0 голосов
/ 10 января 2020

Это сработало для меня, я был действительно слеп, не видя .or function

 or(Supplier<? extends Optional<? extends T>> supplier)

 public Optional<String> findBetweenTwo(Page lastPage,Optional<Page> nextToLast,Pattern pattern) {
    return lastPage.locate(pattern).or(() -> nextToLast.flatMap(p -> p.locate(pattern)));
}
...