Fala galera. Recentemente eu fiz um teste para uma empresa, uma vaga Java Backend e não fui aprovado. Alguns erros e outras coisas. Mas fiquei na dúvida com o que me foi respondido pelo examinador e gostaria de quem pudesse ajudar. Segue os códigos e depois minha dúvida:
CarrinhoCompras.java
package br.com.improving.carrinho;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
public class CarrinhoCompras {
private List<Item> listaDeItens;
public void adicionarItem(Produto produto, BigDecimal valorUnitario, int quantidade) {
int posicaoDoItem = -1;
for(int i = 0; i < getItens().size() & posicaoDoItem < 0; i++) {
Item temp = listaDeItens.get(i);
if(temp.getProduto().equals(produto)){
posicaoDoItem = i;
}
}
try {
if(!(posicaoDoItem < 0)) {
Item temp = listaDeItens.get(posicaoDoItem);
quantidade = temp.getQuantidade() + quantidade;
if (temp.getValorUnitario() == valorUnitario) {
valorUnitario = temp.getValorUnitario();
}
//cria novo item e adiciona na lista
Item item = new Item(produto, valorUnitario, quantidade);
item.setValor(item.getValorTotal());
listaDeItens.set(posicaoDoItem, temp);
} else {
Item item = new Item(produto, valorUnitario, quantidade);
item.setValor(item.getValorTotal());
getItens().add(item);
}
} catch(RuntimeException erro) {
erro.getStackTrace();
}
}
public boolean removerItem(Produto produto) {
int posicaoDoItem = -1;
//roda pelos itens da lista atras do mesmo
for(int i = 0; i < getItens().size() && posicaoDoItem < 0; i++) {
Item temp = listaDeItens.get(i);
//se encontrar no produto, seta o valor para o item da lista
if(temp.getProduto().equals(produto)) {
posicaoDoItem = i;
}
}
// se o item estiver na lista, remove pela posicao adicionada anteriormente
if(posicaoDoItem > -1) {
getItens().remove(posicaoDoItem);
return true;
} else {
return false;
}
}
public boolean removerItem(int posicaoItem) {
try {
listaDeItens.remove(posicaoItem);
return true;
} catch(RuntimeException erro) {
return false;
}
}
public BigDecimal getValorTotal() {
//metodos lambda e stream para iterar dentro da lista e somar o valor de todos os itens
getItens().stream().forEach(valor -> valor.getValorTotal().plus());
return (BigDecimal) getItens();
}
public Collection<Item> getItens() {
// se lista vazia, cria uma nova
if(listaDeItens == null) {
listaDeItens = new ArrayList<>();
}
return listaDeItens;
}
}
CarrinhoComprasFactory.java
package br.com.improving.carrinho;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class CarrinhoComprasFactory {
private Map<String, CarrinhoCompras> carrinhosDeCompras = new HashMap<>();
public CarrinhoComprasFactory() {
}
public CarrinhoCompras criar(String identificacaoCliente) {
CarrinhoCompras carrinhoCompras = new CarrinhoCompras();
if(!(carrinhosDeCompras.containsKey(identificacaoCliente))) {
carrinhosDeCompras.put(identificacaoCliente, carrinhoCompras);
} else {
carrinhoCompras = null;
}
return carrinhoCompras;
}
public BigDecimal getValorTicketMedio() {
List<CarrinhoCompras> carrinhoComprasMedio = new ArrayList<>(this.carrinhosDeCompras.values());
BigDecimal valorTicketMedio = (BigDecimal) valorTicket(carrinhoComprasMedio);
return valorTicketMedio.setScale(2, RoundingMode.HALF_EVEN);
}
public boolean invalidar(String identificacaoCliente) {
try {
carrinhosDeCompras.remove(identificacaoCliente);
return true;
}
catch(RuntimeException erro) {
return false;
}
}
private Object valorTicket(List<CarrinhoCompras> carrinhos) {
carrinhos.stream().forEach(s -> s.getValorTotal().plus().divide(new BigDecimal(carrinhos.size())));
return carrinhos;
}
@Override
public String toString() {
return "Cliente: " + carrinhosDeCompras;
}
}
Item.java
package br.com.improving.carrinho;
import java.math.BigDecimal;
public class Item {
private Produto produto;
private BigDecimal valorUnitario;
private int quantidade;
private BigDecimal valor;
public Item(Produto produto, BigDecimal valorUnitario, int quantidade) {
this.produto = produto;
this.valorUnitario = valorUnitario;
this.quantidade = quantidade;
}
public Produto getProduto() {
return this.produto;
}
public void setValor(BigDecimal valor) {
this.valor = valor;
}
public BigDecimal getValorUnitario() {
return this.valorUnitario;
}
public int getQuantidade() {
return this.quantidade;
}
public BigDecimal getValorTotal() {
BigDecimal valorTotalItem;
BigDecimal vt = new BigDecimal(quantidade);
valorTotalItem = vt.multiply(valorUnitario);
return valorTotalItem;
}
@Override
public String toString() {
return "Item [Produto=" + produto + ", Valor Unitario=" + valorUnitario + ", Valor=" + valor + ", Quantidade=" + quantidade + "]\n";
}
}
Produto.java
package br.com.improving.carrinho;
import java.util.Objects;
public class Produto {
private Long codigo;
private String descricao;
public Produto(Long codigo, String descricao) {
this.codigo = codigo;
this.descricao = descricao;
}
public Long getCodigo() {
return codigo;
}
public String getDescricao() {
return descricao;
}
@Override
public String toString() {
return "Produto [descricao=" + descricao + "]";
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (!(o instanceof Produto)) return false;
Produto produto = (Produto) o;
return getCodigo().equals(produto.getCodigo()) &&
getDescricao().equals(produto.getDescricao());
}
@Override
public int hashCode() {
return Objects.hash(getCodigo(), getDescricao());
}
}
TesteCarrinho.java
package br.com.improving.carrinho;
import java.math.BigDecimal;
public class TesteCarrinho {
public static void main(String[] args) {
BigDecimal v = new BigDecimal("4.12");
BigDecimal v1 = new BigDecimal("8.24");
BigDecimal v2 = new BigDecimal("1.14");
BigDecimal v3 = new BigDecimal("3.12");
BigDecimal v4 = new BigDecimal("5.24");
BigDecimal v5 = new BigDecimal("2.50");
BigDecimal v6 = new BigDecimal("6.51");
Produto p = new Produto(1L, "Leite");
Produto p1 = new Produto(1L, "Carne");
Produto p2 = new Produto(1L, "Pão");
Produto p3 = new Produto(1L, "Arroz");
Produto p4 = new Produto(1L, "Feijão");
Produto p5 = new Produto(1L, "Água");
Produto p6 = new Produto(1L, "Salsicha");
CarrinhoCompras c = new CarrinhoCompras();
CarrinhoCompras c1 = new CarrinhoCompras();
CarrinhoComprasFactory cf = new CarrinhoComprasFactory();
CarrinhoComprasFactory cf1 = new CarrinhoComprasFactory();
System.out.println(cf.criar("Ricardo"));
System.out.println(cf.toString());
//System.out.println(cf.invalidar("Ricardo"));
System.out.println(" ");
//System.out.println(cf.toString());
System.out.println(cf1.criar("Pâmela"));
System.out.println(cf1.toString());
c.adicionarItem(p, v, 2);
c.adicionarItem(p1, v1, 3);
c.adicionarItem(p1, v1, 3);
c.adicionarItem(p2, v2, 1);
//carrinho 2
c1.adicionarItem(p3, v3, 2);//arroz
c1.adicionarItem(p4, v4, 3);//feijao
c1.adicionarItem(p4, v4, 3);//feijao indice 2
c1.adicionarItem(p5, v5, 1);//agua
c1.adicionarItem(p6, v6, 3);//salsicha
//c.removerItem(p1);
c1.removerItem(p4);
//c1.removerItem(3);
System.out.println("Quantidade de itens: " + c.getItens().size());
System.out.println("Lista itens no carrinho: \n");
System.out.println(c.getItens());
//imprimir carrinho 2
System.out.println("Quantidade de itens: " + c1.getItens().size());
System.out.println("Lista itens no carrinho: \n");
System.out.println(c1.getItens());
cf.getValorTicketMedio();
cf1.getValorTicketMedio();
/*AQUI O ERRO
* Exception in thread "main" java.lang.ClassCastException: class java.util.ArrayList cannot be cast to class java.math.BigDecimal (java.util.ArrayList and java.math.BigDecimal are in module java.base of loader 'bootstrap')
at br.com.improving.carrinho.CarrinhoCompras.getValorTotal(CarrinhoCompras.java:155)
at br.com.improving.carrinho.CarrinhoComprasFactory.lambda$0(CarrinhoComprasFactory.java:92)
at java.base/java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1625)
at java.base/java.util.stream.ReferencePipeline$Head.forEach(ReferencePipeline.java:762)
at br.com.improving.carrinho.CarrinhoComprasFactory.valorTicket(CarrinhoComprasFactory.java:92)
at br.com.improving.carrinho.CarrinhoComprasFactory.getValorTicketMedio(CarrinhoComprasFactory.java:60)
at br.com.improving.carrinho.TesteCarrinho.main(TesteCarrinho.java:68)
*
*/
}
}
No erro acima desse TesteCarrinho.java diz que não dá para converter BigDecimal para List. E ja tentei mudar para Double mas também não consegui. É possível fazer isso? Imprimir esse valor vindo dessa lista? Tem mais alguma coisa errada nesse método?
Uma outra: na resposta da empresa me disseram que Lista não é uma estrutura de dados indicada para esse tipo de aplicação. Mas penso que Pilha também não seria (problema para remover um item do meio por exemplo) e talvez árvore binária ou um grafo não seria bom também. Isso procede? Uma lista ser ruim para esse tipo de aplicação? Talvez um HashMap?
Desde já obrigado a todos que puderem responder. Já fui dispensado do processo. Até.