3 votes

Requête de flux avec deux listes

J'ai une liste d'objets de visite, et je veux maintenant construire une autre liste contenant les heures disponibles pour un jour donné ;

public class Visit {
    private int id;
    private Date date;
    private Time time;
    private Pet pet;
    private Vet vet;  

il s'agit d'un tableau String[] contenant toutes les heures de visite :

public class VisitTime {

    private static final String[] visitTime = 
        {"09:00:00","09:30:00","10:00:00","10:30:00","11:00:00","11:30:00","12:00:00",
                "12:30:00","13:00:00","13:30:00","14:00:00","14:30:00","15:00:00","15:30:00","16:00:00","16:30:00"};

Je récupère donc la liste des visites de la base de données (chaque visite a une durée définie), et je vérifie s'il y a une autre heure libre pour programmer une visite.

J'ai écrit deux méthodes pour le faire, l'une avec itération, l'autre avec des flux, qui fonctionnent toutes deux comme prévu.

Ce que je demande, c'est comment je peux reconstruire cette méthode pour NE PAS utiliser la méthode terminale deux fois.

public List<String> getHoursAvailable12(int vetId, String date){
        List<Visit> visitList = getVisitByVetIdAndDate(vetId, date);
        List<String> hoursAvailable = new ArrayList<>(Arrays.asList(VisitTime.getVisittime()));

        List<String> hoursTaken = visitList.stream().map(Visit::getTime).map(Time::toString).collect(Collectors.toList());

        return hoursAvailable.stream().filter(x -> !hoursTaken.contains(x)).collect(Collectors.toList());
    }

et voici la méthode traditionnelle avec les collections :

public List<String> getHoursAvailable(int vetId, String date){
        List<Visit> visitList = getVisitByVetIdAndDate(vetId,date);
        ArrayList<String> hoursAvailable = new ArrayList<>(Arrays.asList(VisitTime.getVisittime()));

        for(Visit x : visitList){
            {
            String time = x.getTime().toString();
            if(hoursAvailable.contains(time)) hoursAvailable.remove(time);
            }
        }
        return hoursAvailable;
    }

1voto

sidgate Points 6089

Vous pouvez essayer ceci. Vous en tirerez des avantages, contains est plus rapide en HashSet par rapport à la liste

public Set<String> getHoursAvailable(int vetId, String date){
    List<Visit> visitList = getVisitByVetIdAndDate(vetId,date);
    Set<String> hoursAvailable = new LinkedHashSet<>(
          Arrays.asList(VisitTime.getVisittime()));

    visitList.stream()
       .map(Visit::getTime)
       .map(Time::toString)
       .forEach(vt-> hoursAvailable.removeIf(s->s.equals(vt)));

    return hoursAvailable;
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X