Optional java пытаюсь получить объект

156
08 июля 2019, 03:10

есть метод который возвращает оптионал я указываю

 public <R> Optional<R> db(String sql, List<Object> param, FunEx<PreparedStatement, R> fun) {
        Optional rsl = Optional.empty();
        try (var conn = source.getConnection();
             var pr = conn.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS)) {
            this.forIdex(param, (index, value) -> dispat.get(value.getClass()).accept(index + 1, pr, value));
            rsl.of(fun.apply(pr));
            System.out.println(fun.apply(pr));
            System.out.println(rsl.get());
        } catch (Exception e) {
            LOGGER.error(e.getMessage(), e);
        }
        return rsl;
    }

и так у нас в методе есть функциональный метод который вернёт нам что-то к примеру объект юзер fun.apply(pr) также я пробую ниже вывести в консоль этого юзера System.out.println(fun.apply(pr)); и в консоль я нормально вывожу
Users{id=59 createDate=2018-12-26T23:37:21.315052, name=sacha , login=alexmur07} но почему я не могу добавить объект пользователя в оптионал? rsl.of(fun.apply(pr)); - в это строчку я его добавляю и вот в этой строчке System.out.println(rsl.get()); я получаю java.util.NoSuchElementException: No value present будто элемент не был добавлен в оптионал да как так то????

public Users findById(Users users) {
        return this.db(
                "select * from users where id = ?", Arrays.asList(Integer.valueOf(users.getId())),
                ps -> {
                    Users res = null;
                    try (ResultSet rs = ps.executeQuery()) {
                        if (rs.next()) {
                            res = new Users(String.valueOf(rs.getInt("id")), rs.getString("name"),
                                    rs.getString("login"), rs.getTimestamp("create_date").toLocalDateTime());
                        }
                    } catch (SQLException e) {
                        LOGGER.error(e.getMessage(), e);
                    }
                    return res;
                }
        ).orElse(new Users());
    }
Answer 1

rsl.of(fun.apply(pr)); на самом деле транслируется в Optional.of(fun.apply(pr));

Этот метод создает новый инстанс Optional.

Исправьте на

rsl = Optional.of(fun.apply(pr));

и будет вам счастье.

READ ALSO
Создание фильтра сервлета

Создание фильтра сервлета

Пытаюсь создать фильтр, но не выходитВ файле web структуры проекта maven значение filter-servlet выделяет красным, как ошибку

158
Многоточие в регулярных выражениях

Многоточие в регулярных выражениях

Не выходит заставить регулярное выражение принимать только точкуВ строке присутствует как точка так и многоточие(при чем как в первом так...

169
Класс сервисы и DTO не видят класс @ConfigurationProperties

Класс сервисы и DTO не видят класс @ConfigurationProperties

Имеется класс с аннотацией @ConfigurationPropertiesВ нем находятся поля, которые подгружаются из файла

135
В сокет отправляется не полная строка

В сокет отправляется не полная строка

Есть клиент на java, который отправляет длинный json на сервер, который написан на pythonЕсли длина json'а не очень большая, то все нормально отправляется

126