@n199a
Java

Как в Stream получить объект из предыдущего шага?

Имеется метод в ДАО слое. В методе составляется запрос с помощь CriteriaBuilder. В данный метод в качестве аргумента приходит Map<ColumnName, SqlSortOperator> params:
@Override
    public Set<GiftCertificate> findAllOrderBy(Map<ColumnName, SqlSortOperator> params) {
        CriteriaBuilder cb = entityManager.getCriteriaBuilder();
        CriteriaQuery<GiftCertificate> cq = cb.createQuery(GiftCertificate.class);
        Root<GiftCertificate> from = cq.from(GiftCertificate.class);
        // work with Stream....
}


Сделал работу с Map следующим образом:
Set<Order> orders = new HashSet<>();        
for(Map.Entry<ColumnName, SqlSortOperator> entry : params.entrySet()) {
    String field = entry.getKey().name().toLowerCase();
    Path<String> path = from.get(field);

    SqlSortOperator sqlSortOperator = entry.getValue();
    Order order = sqlSortOperator.equals(SqlSortOperator.ASC) ? cb.asc(path) : cb.desc(path);            
    orderSet.add(order);
}


Выглядит громоздко, решил переписать с использованием Stream, но столкнулся с моментом - Как в Stream получить объект из предыдущего шага:
Set<Order> orders = params.entrySet().stream()
                .map(Map.Entry::getKey)
                .map(Enum::name)
                .map(String::toLowerCase)   // String columnName = "name"
                .map(from::get) // Path<String> path = from.get(columnName);
                .map() // Как выполнить SqlSortOperator sqlSortOperator = entry.getValue();
                .map() // Order order = sqlSortOperator.equals(SqlSortOperator.ASC) ? cb.asc(path) : cb.desc(path); 
                .collect(Collectors.toSet());
  • Вопрос задан
  • 228 просмотров
Решения вопроса 1
@n199a Автор вопроса
Java
Вот пример. Получить можно объект из любого предыдущего шага. Для этого нужно открыть новый Stream.of() внутрти текущего стрима:

return orderDao.findUsersWithHighestCostOfAllOrders().stream()
                .flatMap(up -> Stream.of(up)
                        .map(UserPrice::getUser)
                        .map(this::findAllGiftCertificatesByUser)
                        .map(this::findAllTagsFromGiftCertificates)
                        .map(this::findCountOfRepetitionsOfEachTag)
                        .map(map -> buildMostWidelyUsedTag(up, map)))
                .collect(Collectors.toSet());
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
xez
@xez Куратор тега Java
TL Junior Roo
Никак. Надо искать другое решение.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы