2017-02-20 15 views
1

Я пытаюсь преобразовать Еогеасп к потокамJAVA Foreach Потоку

for (Entity entity : listOfEntitys.getAll()) { 
     if (!isEntityDateValid(entity.getStartDate()) 
       || !isEntityDateValid(entity.getEndDate())) { 
      return false; 
     } 
    } 

Так я преобразовать его, как этот

if (listOfEntitys.getAll() != null) { 
     return listOfEntitys.getAll().stream().anyMatch(entity-> !isEntityDateValid(entity.getStartDate()) 
       || !isEntityDateValid(entity.getEndDate())); 
    } 

Но я испортил его, потому что он всегда оценивает логическое значение и я только хочу вернуть его, когда он удовлетворяет условию

+0

Условный оператор возврата не может быть изменен на чистый поток, но если вы покажете нам больше кода, возможно, мы сможем помочь вам – ByeBye

+1

Нулевой флажок не требуется, поскольку for-each также потерпит неудачу, если 'getAll' возвращает null. – john16384

ответ

3

Если вы хотите, чтобы возврат выполнялся при определенных условиях, ваша команда потока должна быть частью состояния if Мент.

if (listOfEntities.getAll()!=null && listOfEntities.getAll().stream().anyMatch(...)) { 
    return false; 
} 

Но это может быть яснее, используя !allMatch(X && Y), а не anyMatch(!X || !Y).

if (listOfEntities.getAll()!=null 
    && !listOfEntities.getAll().stream() 
      .allMatch(entity -> isEntityDateValid(entity.getStartDate()) 
        && isEntityDateValid(entity.getEndDate()))) { 
    return false; 
} 
0

Ваша ошибка состоит в том, что anyMatch вернется true если какой-либо из записей, удовлетворяющих вашим условию:

return listOfEntitys.getAll().stream().anyMatch(entity-> !isEntityDateValid(entity.getStartDate()) 
      || !isEntityDateValid(entity.getEndDate())); 

Так что добавьте не туда:

return !listOfEntitys.getAll().stream().anyMatch(entity-> !isEntityDateValid(entity.getStartDate()) 
      || !isEntityDateValid(entity.getEndDate())); 
0

Так он выглядит, как вы имеют цикл for, который будет возвращает true, если все даты действительны или возвращают false, как только один не равен.
Отсутствует return true, но я думаю, что он есть, иначе ваши первоначальные переводы не имели бы смысла.

Правильный способ осуществить это с помощью allMatch(), который является метод, который наиболее точно передает смысл цикла:

return listOfEntitys.getAll().stream() 
     .allMatch(e -> isEntityDateValid(e.getStartDate) || isEntityDateValid(e.getEndDate())); 

Это возвращает истину, если и только если все субъекты имеют действительные даты , Как только один из них недействителен, он возвращает false. Также как ваш цикл for.

Это также имеет дополнительную выгоду, что он избегает отрицательных условных обозначений, что является одним из правил для получения более чистого кода.