Eu tenho um map que uso como “database” para armazenar algumas coisas. Imagine um sistema de matrículas.
Pois bem. Esse método aqui percorre procurando um curso cadastrado, e eu sei que esse curso existe, mas ainda assim ele só cai no null. Não tô entendendo o pq…
public CursoEntity findByName(String name){
List<CursoEntity> cursoList = new ArrayList<>(getDatabase().values());
for (CursoEntity cursoEntity : cursoList) {
boolean isName = cursoEntity.getNome().equals(name);
if (isName) {
return cursoEntity;
}
}
return null;
}
Então, não está vazia. Na verdade, quando eu chamo o método que procura um curso pelo nome (que usa esse método), ele me retorna tranquilo. Mas quando chamo o método para procurar o curso e fazer a matrícula, ele não acha.
Tava vendo aqui e não entendi uma coisa: O meu database, nesse método, retorna size=0, mas quando chamo ele normalmente apenas procurando ele retorna o size certo. Véi, isso tá me deixando doido, hue.
Se você já tem um map com as informações, pq você não busca as informações nele, ao invés de converte-lo para uma lista e então iterar, tendo a possibilidade do curso que você quer estar na última posição? Não é viável utilizar a chave do map como sendo uma String (o próprio nome)? Ou até um Set?
Como o @Daniel95 disse, se a lista esta vazia, vai retornar null mesmo.
Estou usando um map para simular um banco de dados.
Quando eu cadastro um curso nesse map e quero listar ele, consigo tranquilamente. Mas quando quero criar uma matricula, o getDatabase().values retorna o tamanho de lista 0, e então ele não cai no meu foreach.
Cadastro do curso:
void cadastrarCurso() {
String nome = JOptionPane.showInputDialog("Digite o nome do curso");
int numeroAulas = Integer.parseInt(JOptionPane.showInputDialog("Digite o número de aulas"));
entity = this.curso.save(new CursoEntity(nome, numeroAulas));
JOptionPane.showMessageDialog(null, "Curso cadastrado!\nTítulo: "+entity.getNome()+"\nNúmero de Aulas: "+entity.getNumeroAulas()+"\nID: "+entity.getId());
}
@Override
public CursoEntity save(CursoEntity cursoEntity) {
cursoEntity.setId(getNextId());
getDatabase().put(cursoEntity.getId(), cursoEntity);
return cursoEntity;
}
void fazerMatricula() {
userEntity = userController.encontrarPorNome(JOptionPane.showInputDialog("Digite o nome do aluno a ser cadastrado"));
cursoEntity = cursoController.procurarPorNome(JOptionPane.showInputDialog("Digite o nome do curso"));
matriculaRepo.save(new MatriculaEntity(selecionarUsuário(userEntity), cursoEntity));
}
}
O values não retorna a Collection dos Values do Map que são as instâncias de Curso cadastradas?
Os valores do Map são sempre armazenados e recuperados em memória? É um atributo de que classe e como é manipulado? O que pode estar acontecendo é de ter mais de uma instância deste Map rolando por aí, e quando você busca e faz matricula, retorne ou consulte instâncias diferentes. No caso desta controller utilizar outro recurso: cursoEntity = cursoController.procurarPorNome(JOptionPane.showInputDialog(“Digite o nome do curso”));
Provavelmente, em algum momento, seu database está sendo recriado. Você precisar controlar bem o estado dele para não ter risco de perder a instância. Como vc está criando seu database? Existe uma classe responsável por cuidar dele (do map)?