Java 8: как сделать проверку состояния между несколькими сравнениями - PullRequest
0 голосов
/ 25 марта 2019

Мне нужно отсортировать коллекцию с несколькими условиями. Но между этими условиями мне нужно изменить данные потока.

Customer.class

import java.math.BigDecimal;
import java.util.Date;

public class Customer {

    private int id;
    private String name;
    private long quantity;
    private BigDecimal cost;
    private Date lastPurchasedDate;

    public Customer(int id, String name, long quantity, BigDecimal cost) {
        this.id = id;
        this.name = name;
        this.quantity = quantity;
        this.cost = cost;
    }

    // setters & getters are omitted for brevity.
}

Main.class

import java.math.BigDecimal;
import java.util.Arrays;
import java.util.Comparator;
import java.util.List;
import java.util.Optional;

public class Main {

    public static void main(String[] args) {
        List<Customer> customers = Arrays.asList(new Customer(1, "A", 10, BigDecimal.valueOf(673.89)),new Customer(2, "B", 10, BigDecimal.valueOf(673.89)));
        getCustomer(customers).ifPresent(c -> System.out.println(c.getId()));
    }

    private static Optional<Customer> getCustomer(List<Customer> customers) {
        // @formatter:off
        return customers.stream()
                .max(
                        Comparator.comparing(Customer::getQuantity)
                        .thenComparing(Customer::getCost)
                         // here I need to check, If multiple customers are after 
                         // comparing the cost, I have to update the lastPurchasedDate l
                         // attribute value & then sort it
                        .thenComparing(Customer::getLastPurchasedDate)
                        );
        // @formatter:on
    }
}

Если после сортировки по стоимости доступно несколько клиентов, мне нужно заполнить значение атрибута lastPurchasedDate , а затем отсортировать по lastPurchasedDate .

Почему я не заполняю данные lastPurchasedDate раньше?

Чтобы получить эту информацию, мне нужно выполнить запрос к базе данных (для получения информации мы будем использовать таблицу, в которой будут миллионы записей). Так что это ограничение производительности, и я хочу избежать этого. Необходим очень редкий сценарий сравнения по lastPurchasedDate . Поэтому я не хочу излишне запускать этот запрос для всех клиентов.

1 Ответ

0 голосов
/ 25 марта 2019

Это решение, которое я придумал ...

import java.math.BigDecimal;
import java.util.Arrays;
import java.util.Comparator;
import java.util.Date;
import java.util.List;
import java.util.Optional;

public class Main {

    public static void main(String[] args) {
        List<Customer> customers = Arrays.asList(new Customer(1, "A", 10, BigDecimal.valueOf(673.89)),new Customer(2, "B", 10, BigDecimal.valueOf(673.89)));
        getCustomer(customers).ifPresent(c -> System.out.println(c.getId()));
    }

    private static Optional<Customer> getCustomer(List<Customer> customers) {
        // @formatter:off
        return customers.stream()
                .max(
                        Comparator.comparing(Customer::getQuantity)
                        .thenComparing(Customer::getCost)
                        .thenComparing(Main::updateLastPurchasedDate)
                        );
        // @formatter:on
    }

    private static Date updateLastPurchasedDate(Customer c) {
        Date lastPurchasedDate = customerRepository.getLastPurchasedDateById(c.getId());
        if(lastPurchasedDate == null) {
            return new Date(10000);
        }
        return lastPurchasedDate;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...