2015-03-21 4 views
5

schrieb ich ein Stück Code und frage mich, wie ich schreiben kann es eleganter, Bäche mit hier ist sie:Wie schreibe ich es mit Streams? 8 Java

public boolean possibleToAddTask(LocalDate taskDate, final String username) { 
     List<Task> userTasklist = find(username).getTaskList(); 
     for(Task task : userTasklist) { 
      if(task.getDate().equals(taskDate)){ 
       return false; 
      } 
     } 
     return true; 
    } 

hier - einige boolean von einer Methode zurückgegeben wird. Wenn angegeben Datum bereits in einiger Aufgabe besteht es falsch gibt, sonst wahr (so den Rückgabetyp beantwortet die Frage in Methode Namen angehoben :))

Ich war mit Filter auf Ströme versucht, aber es funktionierte nur für eine Weile, und dann Unit-Tests gab mir einige unerwartete Ergebnisse, also habe ich es gelöscht und schrieb es wie Its oberen. Jetzt will ich verschönern es

zuvor es so war:

public boolean possibleToAddTask(LocalDate taskDate, final String username) { 
     List<Task> userTasklist = find(username).getTaskList(); 

     try { 
      userTasklist.stream().filter(n -> n.getDate().equals(taskDate)).findFirst().get(); 
      return true; 
     } catch (NoSuchElementException e) { 
      return false; 
     } 
    } 

Dank im Voraus :)

Antwort

10

Methode findfirst() eines optionalen zurück. Sie können also einfach prüfen, ob optional ist leer.

return !userTasklist.stream() 
.filter(n -> n.getDate().equals(taskDate)) 
.findFirst().isPresent(); 

Oder noch einfacher Ansatz.

return !userTasklist.stream().anyMatch(n -> n.getDate().equals(taskDate)); 

EDIT: Nun sollten Unit-Tests bestehen.

+0

Hmm ... Vielleicht ist dies ein bisschen besser, da es die ursprüngliche Logik enger nachahmt. – kuujo

+0

@lusiak Scheint die perfekte Lösung zu sein, aber der Komponententest ist immer noch OK für No-Stream-Lösungen und FAILS für Streams-Lösungen – azalut

+1

Ich weiß wahrscheinlich warum. Negiere einfach, welcher Stream zurückkehrt. –

0

Wie wäre es etwas lik Umwandlung der Liste in Set zu tun und dann enthält() aufrufen:

return userTasklist.stream().map(Task::getDate).collect(Collectors.toSet()).contains(taskDate);