Uma coisa que já li é que devemos representar coisas do mundo real que fazem sentido no nosso contexto e nem tudo precisa ser representado.
Talvez o correto seria um Leilao ter um Avaliador e dentro dele estar a lista de lances recebidos com as operaçoes de max, minino, etc.
Aí ele registraria lances tbm... :)
Se fosse adicionado mais features que dizem respeito ao Avaliador aí sim faria sentido representá-lo no modelo, mas do jeito que está no momento é apenas uma classe que serve para tirar estatísticas do leilão que possui a lista de lances.
package br.com.caelum.leilao.servico;
import java.util.Collections;
import java.util.Comparator;
import java.util.DoubleSummaryStatistics;
import java.util.List;
import java.util.Objects;
import com.google.common.collect.Lists;
import br.com.caelum.leilao.dominio.Lance;
import br.com.caelum.leilao.dominio.Leilao;
public class Avaliador {
private double maiorLance;
private double menorLance;
private double lanceMedio;
private Leilao leilao;
public void avaliar(Leilao leilao){
Objects.requireNonNull(leilao);
if(!leilao.getLances().isEmpty()){
this.leilao = leilao;
DoubleSummaryStatistics summaryStatistics = leilao.getLances().stream()
.mapToDouble(l->l.getValor())
.summaryStatistics();
maiorLance = summaryStatistics.getMax();
menorLance = summaryStatistics.getMin();
lanceMedio = summaryStatistics.getAverage();
}
}
public double getMaiorLance() {
return maiorLance;
}
public double getMenorLance() {
return menorLance;
}
public double getLanceMedio() {
return lanceMedio;
}
public List<Lance> getTresMaioresLances() {
if(leilao!=null){
List<Lance> lances = Lists.newArrayList(leilao.getLances());
int indiceMinimoTresMaioresLances = lances.size() - 3 >= 0 ? lances.size() - 3 : 0;
List<Lance> tresMaioresLances = lances.subList(indiceMinimoTresMaioresLances,lances.size());
Collections.sort(tresMaioresLances, Comparator.comparingDouble(Lance::getValor).reversed());
return tresMaioresLances;
}
return Lists.newArrayList();
}
}
Ex de como poderia ser
package br.com.caelum.leilao.dominio;
import java.util.Collections;
import java.util.List;
import com.google.common.collect.Lists;
public class Leilao {
private String descricao;
private List<Lance> lances;
public Leilao(String descricao) {
this.descricao = descricao;
this.lances = Lists.newArrayList();
}
public void propoe(Lance lance) {
lances.add(lance);
Collections.sort(lances);
}
public String getDescricao() {
return descricao;
}
public EstatisticasDoLeilao getEstatiscasDoLeilao() {
return new EstatisticasDoLeilao(this);
}
public List<Lance> getLances() {
return Collections.unmodifiableList(lances);
}
@Override
public String toString() {
return String.format("Leilao [descricao=%s, lances=%s]", descricao, lances);
}
}
package br.com.caelum.leilao.dominio;
import java.util.Collections;
import java.util.Comparator;
import java.util.DoubleSummaryStatistics;
import java.util.List;
import java.util.Objects;
import com.google.common.collect.Lists;
public class EstatisticasDoLeilao {
private double maiorLance;
private double menorLance;
private double lanceMedio;
private List<Lance> tresMaioreslances;
public EstatisticasDoLeilao(Leilao leilao) {
Objects.requireNonNull(leilao);
gerarEstatisticas(leilao);
}
private void gerarEstatisticas(Leilao leilao) {
if(!leilao.getLances().isEmpty()){
DoubleSummaryStatistics summaryStatistics = leilao.getLances().stream()
.mapToDouble(l->l.getValor())
.summaryStatistics();
maiorLance = summaryStatistics.getMax();
menorLance = summaryStatistics.getMin();
lanceMedio = summaryStatistics.getAverage();
definirTresMaioresLances(leilao);
}else{
this.tresMaioreslances = Lists.newArrayList();
}
}
public double getMaiorLance() {
return maiorLance;
}
public double getMenorLance() {
return menorLance;
}
public double getLanceMedio() {
return lanceMedio;
}
private void definirTresMaioresLances(Leilao leilao) {
List<Lance> lances = Lists.newArrayList(leilao.getLances());
int indiceMinimoTresMaioresLances = lances.size() - 3 >= 0 ? lances.size() - 3 : 0;
List<Lance> tresMaioresLances = lances.subList(indiceMinimoTresMaioresLances,lances.size());
Collections.sort(tresMaioresLances, Comparator.comparingDouble(Lance::getValor).reversed());
this.tresMaioreslances = tresMaioresLances;
}
public List<Lance> getTresMaioreslances() {
return tresMaioreslances;
}
}