Мне нужно отсортировать коллекцию с несколькими условиями. Но между этими условиями мне нужно изменить данные потока.
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 . Поэтому я не хочу излишне запускать этот запрос для всех клиентов.