2015-03-21 12 views
5

ho scritto un pezzo di codice e mi chiedo come posso scriverlo più elegante, utilizzando i flussi qui è:Come scriverlo usando i flussi? Java 8

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; 
    } 

qui - alcuni booleano viene restituito da un metodo. Se la data specificata esiste già in qualche operazione restituisce falso, altrimenti vero (in modo che il tipo restituito risponde alla questione sollevata in nome di metodo :))

Stavo cercando di filtri sui corsi d'acqua, ma ha funzionato solo per un po 'e poi i test unitari mi hanno dato dei risultati inaspettati, quindi l'ho cancellato e l'ho scritto come nella sua parte superiore. Ora voglio abbellirla

precedenza era come questo:

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; 
     } 
    } 

grazie in anticipo :)

risposta

10

metodo FindFirst() restituiscono un optional. Quindi puoi controllare se l'opzione è vuota.

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

O ancora più facile approccio.

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

EDIT: Ora unit test dovrebbe passare.

+0

Hmm ... Forse questo è un po 'meglio dato che imita la logica originale più da vicino. – kuujo

+0

@lusiak Sembra essere la soluzione perfetta, tuttavia il test dell'unità restituisce OK per soluzioni no-stream e FAILS per le soluzioni di streaming – azalut

+1

Probabilmente so perché. Basta negare ciò che il flusso restituisce. –

0

Che ne dite di fare qualcosa lik trasformando l'elenco in Imposta e quindi chiamando contiene():

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