Checkar quando passou um mes de certa data

Estou a fazer um sistema de controlo financeiro. Por exemplo: a cada mês recebo o ordenado. A questão é como fazer para verificar se já passou um mes desde o ultimo ordenado. Aqui está o que tenho até agora:

private void checkMensal(Set<Movimento> set) {
    set.forEach((mov) -> {
        List<Movimento> collect = set
                .stream()
                .filter(s -> s.getFrequencia() == FrequenciaEnum.MENSAL && s.getNomeItem().equalsIgnoreCase(mov.getNomeItem()))
                .collect(Collectors.toList());
        if (collect.size() <= 0) {
            return;
        }

        Calendar calendar = Calendar.getInstance();
        calendar.setTime(collect.get(collect.size() - 1).getData());
        int dia = calendar.get(Calendar.DAY_OF_YEAR);
        int diasMes = calendar.getActualMaximum(Calendar.DAY_OF_MONTH);
        if ((dia + diasMes) >= Calendar.getInstance().get(Calendar.DAY_OF_YEAR)) {
            System.out.println("Dia do ano: " + Calendar.getInstance().get(Calendar.DAY_OF_YEAR) + ", Dia: "
                    + dia + ", Dia do Mes: " + diasMes+ ", Soma: " + (dia + diasMes));
            mov.setData(new Date());
            dao.inserir(mov);
        }
    });
}

O sinal estava errado
Errado:
((dia + diasMes) >= Calendar.getInstance().get(Calendar.DAY_OF_YEAR))
Certo
((dia + diasMes) <= Calendar.getInstance().get(Calendar.DAY_OF_YEAR))

1 curtida

Alguem me sabe recomendar uma forma eficiente de fazer isto?

1 curtida

Crie um filtro usando um HashMap:

HashMap<String, List<Movimento>> filtro = new HashMap();
set.stream()
    .filter(s -> s.getFrequencia() == FrequenciaEnum.MENSAL)
    .forEach(s -> {
      String key = s.getNomeItem().toUpperCase(); // chave usada para agrupar os movimentos
      List<Movimento> list = filtro.get(key);
      if (list == null) {
        list = new ArrayList(); // arraylist é melhor
        filtro.put(key, list);
      }
      list.add(s);
    });

filtro.values().forEach(list->{
  // faz os calculos com a data
});

Vc usou a estrutura Set que significa Conjunto e conjuntos não possuem repetições e não são indexados, então o forEach não garante que os elementos estarão na ordem que foram inseridos ou por data, então collect.get(collect.size() - 1) também não é garantia que vai retornar o último (ou o mais recente).