Хобрук: Ваш путь к мастерству в программировании

Преобразование SQL в java-лямбда

У меня есть следующий запрос, который я хотел бы преобразовать для использования в классе List, который у меня есть. Цель состоит в том, чтобы преобразовать его в java 8 lambda. Основная проблема, с которой я сталкиваюсь, заключается в том, чтобы вывести «торговлю с полуночи и бумаги» в новый список.

Класс AssetTotals, конечно же, будет содержать 4 поля вывода с аксессорами (цена, количество бумаг, бумага, торговые минуты с полуночи).

SELECT avg(price), count(price), paper, TRADEMINUTESSINCEMIDNIGHT FROM sgdata.ASSET group by TRADEMINUTESSINCEMIDNIGHT, paper order by paper, TRADEMINUTESSINCEMIDNIGHT

public class Asset implements Serializable, Comparable<Asset> {

    private static final long serialVersionUID = 1L;

    @Id @GeneratedValue(strategy=GenerationType.IDENTITY)
    private Long id; // still set automatically

    public Long getId() {
        return id;
    }
    public void setId(Long id) {
        this.id = id;
    }
    long sequenceNo;
    String Exchange;
    String Board;
    long time;
    String paper;
    long tradeTime;
    long quantity;
    double price;
    String source;
    String buyer;
    String seller;
    float changeSinceLast;
    String initator;
    long tradeTimeSinceMidnight;
    long tradeMinutesSinceMidnight;
    long daysSinceEpoch;


    public long getSequenceNo() {
        return sequenceNo;
    }
    public void setSequenceNo(long sequenceNo) {
        this.sequenceNo = sequenceNo;
    }
    public String getExchange() {
        return Exchange;
    }
    public void setExchange(String exchange) {
        Exchange = exchange;
    }
    public String getBoard() {
        return Board;
    }
    public void setBoard(String board) {
        Board = board;
    }
    public long getTime() {
        return time;
    }
    public void setTime(long time) {
        this.time = time;
    }
    public String getPaper() {
        return paper;
    }
    public void setPaper(String paper) {
        this.paper = paper;
    }
    public long getTradeTime() {
        return tradeTime;
    }
    public void setTradeTime(long tradeTime) {
        this.tradeTime = tradeTime;
    }
    public long getQuantity() {
        return quantity;
    }
    public void setQuantity(long quantity) {
        this.quantity = quantity;
    }
    public double getPrice() {
        return price;
    }
    public void setPrice(double price) {
        this.price = price;
    }
    public String getSource() {
        return source;
    }
    public void setSource(String source) {
        this.source = source;
    }
    public String getBuyer() {
        return buyer;
    }
    public void setBuyer(String buyer) {
        this.buyer = buyer;
    }
    public String getSeller() {
        return seller;
    }
    public void setSeller(String seller) {
        this.seller = seller;
    }
    public float getChangeSinceLast() {
        return changeSinceLast;
    }
    public void setChangeSinceLast(float changeSinceLast) {
        this.changeSinceLast = changeSinceLast;
    }
    public String getInitator() {
        return initator;
    }
    public void setInitator(String initator) {
        this.initator = initator;
    }

    public long getDaysSinceEpoch() {
        return daysSinceEpoch;
    }
    public void setDaysSinceEpoch(long daysSinceEpoch) {
        this.daysSinceEpoch = daysSinceEpoch;
    }
    public long getTradeTimeSinceMidnight() {
        return tradeTimeSinceMidnight;
    }
    public void setTradeTimeSinceMidnight(long tradeTimeSinceMidnight) {
        this.tradeTimeSinceMidnight = tradeTimeSinceMidnight;
    }

    public long getTradeMinutesSinceMidnight() {
        return tradeMinutesSinceMidnight;
    }
    public void setTradeMinutesSinceMidnight(long tradeMinutesSinceMidnight) {
        this.tradeMinutesSinceMidnight = tradeMinutesSinceMidnight;
    }


    @Override
    public boolean equals(Object obj) {

        return sequenceNo == ((Asset)obj).sequenceNo;

    }

    @Override
    public int compareTo(Asset otherAsset) {
        if (this.getSequenceNo() < otherAsset.getSequenceNo()) {
            return -1;
        }
        else if (this.getSequenceNo() == otherAsset.getSequenceNo()) {
            return 0;
        }
        return 1;
    }
    @Override
    public String toString() {
        return this.paper + " " + this.price + " " + this.tradeMinutesSinceMidnight;

    }

}
04.05.2015

  • В большинстве случаев лучше позволить базе данных выполнять запросы за вас, а не пытаться получить больше данных, чем вам нужно, в виртуальную машину, а затем выполнять код Java для выполнения поиска и фильтрации. Что вы пытаетесь сделать и почему? 04.05.2015
  • Я бы сделал это в базе данных, если бы у меня была информация в базе данных. Однако я использую список в режиме реального времени и добавляю к нему. Не записывать данные в базу данных и не извлекать их агрегаты. Но я знаю, как это будет выглядеть с использованием базы данных, поэтому я написал, как это будет выглядеть. 04.05.2015
  • Можете ли вы показать, что вы уже пробовали с вашим лямбда-выражением? У вас больше шансов получить ответы от других, если вы сможете показать, как далеко вы продвинулись в своем выражении, а затем попросить конкретную помощь в той части выражения, которую вы не можете заставить работать, вместо того, чтобы просить кого-то помочь. написать выражение для вас? 05.05.2015

Ответы:


1
List<Asset> list=…;
Comparator<Asset> group=Comparator.comparing(Asset::getPaper)
                                  .thenComparing(Asset::getTradeMinutesSinceMidnight);
list.stream().collect(Collectors.groupingBy(
        Function.identity(), ()->new TreeMap<>(group),
        Collectors.summarizingDouble(Asset::getPrice)))
    .forEach((a,p)-> System.out.println(
             a.getPaper()
       +"\t"+a.getTradeMinutesSinceMidnight()
       +"\t"+p.getAverage()
       +"\t"+p.getCount()));

Поскольку вы хотите группировать и сортировать по одним и тем же свойствам, самый простой способ добиться этого — собрать в отсортированную карту, которая использует соответствующий Comparator. Результирующая карта будет иметь Asset экземпляров в качестве ключей, которые имеют разные кортежи для этих свойств, но вы не должны делать никаких предположений о других свойствах, поскольку ключевой объект — это всего лишь один произвольный экземпляр, выбранный из группы.

Значения карты определяются нижестоящим сборщиком, который является сборщиком summarizingDouble(Asset::getPrice), который создает экземпляр DoubleSummaryStatistics, содержащий все агрегированные значения для свойства price, max, min, average, count и sum. Я напечатал здесь count в соответствии с вашим вопросом, однако, я подозреваю, что вы на самом деле хотите вместо этого sum, но это легко изменить.

Сравните также с этим ответом, в котором также обсуждаются связанные задачи группировки по одному свойству и объединения нескольких свойств.

05.05.2015
  • Ничего себе, это безумно сложный способ сделать что-то, что занимает одну строку в sQL. Я испытаю это как можно скорее! 06.05.2015
  • Новые материалы

    Решения DBA Metrix
    DBA Metrix Solutions предоставляет удаленного администратора базы данных (DBA), который несет ответственность за внедрение, обслуживание, настройку, восстановление базы данных, а также другие..

    Начало работы с Блум
    Обзор и Codelab для генерации текста с помощью Bloom Оглавление Что такое Блум? Некоторые предостережения Настройка среды Скачивание предварительно обученного токенизатора и модели..

    Создание кнопочного меню с использованием HTML, CSS и JavaScript
    Вы будете создавать кнопочное меню, которое имеет состояние наведения, а также позволяет вам выбирать кнопку при нажатии на нее. Финальный проект можно увидеть в этом Codepen . Шаг 1..

    Внедрите OAuth в свои веб-приложения для повышения безопасности
    OAuth — это широко распространенный стандарт авторизации, который позволяет приложениям получать доступ к ресурсам от имени пользователя, не раскрывая его пароль. Это позволяет пользователям..

    Классы в JavaScript
    class является образцом java Script Object. Конструкция «class» позволяет определять классы на основе прототипов с чистым, красивым синтаксисом. // define class Human class Human {..

    Как свинг-трейдеры могут использовать ИИ для больших выигрышей
    По мере того как все больше и больше профессиональных трейдеров и активных розничных трейдеров узнают о возможностях, которые предоставляет искусственный интеллект и машинное обучение для улучшения..

    Как построить любой стол
    Я разработчик программного обеспечения. Я люблю делать вещи и всегда любил. Для меня программирование всегда было способом создавать вещи, используя только компьютер и мое воображение...