2015-03-21 33 views
5

Java 8 Ben kod parçası yazdım ve işte burada akışları kullanarak, bu daha şık yazabilir acaba:Akışları kullanarak nasıl yazılır?

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

İşte - bazı boolean bir yöntem döndürülür. Belirtilen tarih zaten, bu yanlış döndüren bazı görev varsa aksi gerçek (böylece döndürme türü yöntemin adı :) büyüdü sorusunu yanıtlar)

Ben akışlarında filtrelerle çalışıyordu ama sadece çalıştı Bir süre sonra birim testleri bazı beklenmedik sonuçlar verdi, ben de onu sildim ve onun üstünü gibi yazdım. Şimdi bunun

daha önce böyleydi güzelleştirmek istiyorum: önceden

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

sayesinde :)

cevap

10

Yöntem FindFirst() Bir Opsiyonel döner. Yani isteğe bağlı boş olup olmadığını kontrol edebilirsiniz.

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

Ya da daha kolay bir yaklaşım.

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

DÜZENLEME: Artık birim testleri geçmelidir. çağırmadan sonra Set içine Listesini dönüşüm lik bir şey yapıyor ve yaklaşık içerdiği Nasıl

+0

Hmm ... daha yakından özgün mantığı taklit beri Belki bu biraz daha iyidir. – kuujo

+0

@lusiak Kusursuz bir çözüm gibi görünüyor, ancak ünite testi hala akışsız çözümler için tamam, ve akarsu çözümleri için FAILS – azalut

+1

Muhtemelen nedenini biliyorum. Sadece akışın geri dönüşünü reddet. –

0

():

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