Использование Jsoup Elements.select () с Optional.ifPresent - PullRequest
0 голосов
/ 27 февраля 2019

Простите за вопрос новичка.Я пытаюсь построить веб-скребок.Я создал вспомогательный класс Selectors для хранения селекторов CSS другого типа, и у класса есть метод getter, который возвращает необязательное значение поля:

public Optional<String> getName() {
    return Optional.ofNullable(this.name);
}

В моем основном Scrapper классе у меня есть метод дляизвлеките имя из HTML, используя объект Selectors, подобный следующему:

public String extractName(Element building) {
    if (this.selectors.getName().isPresent()) {
        String cssSelector = this.selectors.getName().get();
        Elements buildingNameElement = building.select(cssSelector);
        return buildingNameElement.text();
    }
    return "N/A";
}

Насколько я читал, это не очень хороший способ использовать класс Optional.Но я изо всех сил пытаюсь найти лучшее решение.Моей первой мыслью было использование метода ifPresent, но он не работает таким образом:

public String extractName(Element building) {
    this.selectors.getName().ifPresent(() -> {
        String cssSelector = this.selectors.getName().get();
        Elements buildingNameElement = building.select(cssSelector);
        return buildingNameElement.text();
    });
    return "N/A";
}    

Я бы хотел, чтобы Elements.select() выполнялся только в том случае, если в поле * присутствует поле имени1016 * объект.Может ли кто-нибудь помочь мне сделать код более функциональным?

Спасибо!

1 Ответ

0 голосов
/ 27 февраля 2019
public String extractName(Element building) {
     return this.selectors
             .getName()
             .map(cssSelector -> {
                        Elements buildingNameElement = building.select(cssSelector);
                        return buildingNameElement.text();
                    })
             .orElse("N/A");
}  

Для этого Optional.map.Когда вы делаете return внутри лямбды, вы возвращаетесь только из лямбды, а не из внешнего метода.Таким образом, вышеприведенное использует текст элемента имени здания, если getName вернул имя / селектор.И возвращает N/A, если нет.

Если у вас все в порядке с более сжатым синтаксисом и меньшим количеством именованных переменных, вы можете использовать следующее:

     return this.selectors
             .getName()
             .map(cssSelector -> building.select(cssSelector).text())
             .orElse("N/A");

Отказ от ответственности: Я не имеюУ меня на компьютере JSoup, поэтому я не проверял.Пожалуйста, прости, если есть опечатка, и доложи.

...