2015-03-21 2 views
5

я написал кусок кода и интересно, как я могу написать это более элегантно, используя потоки здесь:Как написать это с помощью потоков? 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; 
    } 

Вот - некоторые булево возвращается из метода. Если указанная дата уже существует в некоторой задаче она возвращает ложных, в противном случае истинный (так возвращаемый тип отвечает на вопрос, поставленный в названии метода :))

Я пытался с помощью фильтров на потоках, но он работал только для в то время, а затем модульные тесты дали мне неожиданные результаты, поэтому я удалил его и написал его как «Верхний». Теперь я хочу, чтобы украсить его

раньше это было так:

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

заранее спасибо :)

ответ

10

Метод FindFirst() возвращают Факультативный. Поэтому вы можете просто проверить, не является ли опция пустым.

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

Или даже более простой подход.

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

EDIT: Теперь юнит-тесты должны пройти.

+0

Хм ... Может быть, это немного лучше, так как он более точно имитирует оригинальную логику. – kuujo

+0

@lusiak Кажется, это идеальное решение, однако модульный тест по-прежнему возвращает OK для безрезультатных решений, а FAILS для потоковых решений – azalut

+1

Я, вероятно, знаю почему. Просто отрицайте, какой поток возвращается. –

0

Как насчет делать что-то Лик преобразование списка в набор, а затем вызова содержит():

return userTasklist.stream().map(Task::getDate).collect(Collectors.toSet()).contains(taskDate); 
Смежные вопросы