2017-02-03 2 views
2

У меня есть существующий код и я ищу, чтобы преобразовать в потоки, предоставляемые Java8:Изучение Java 8 потоков

for(Person details: modList){ 

        if (null != details &&null!=details.getPersonChild()) { 
            Child mod= details.getPersonChild(); 

            if (mod.isAB() || 
              mod.isBC() || 
              mod.isCD() || 
              mod.idDE() || 
              mod.isEF()) { 
             childeligible = true; 
               break; 
            } 
        } 
    } 

я до сих пор сделано:

return details.stream() 
       .filter(p -> null != p && null != p.getPersonChild()) 
       .map(Person::getPersonChild) 
       .anyMatch(mi -> (mod.isAB() || mod.isBC() || mod.isCD() || mod.idDE() || mod.isEF())); 

есть более оптимизированный способ для достижения этой цели

Спасибо за помощь

+0

Выглядит хорошо для меня. Зачем вам проверять 'getName', но искать' getPersonChild', почему бы не проверить, является ли это 'null' вместо этого? –

+2

Можете ли вы добавить метод isABCDEF()? –

+0

да извините, мой плохой ... null check был для PersonChild – Hali

ответ

4

так, как я мог бы написать это

return Details.stream() 
      .filter(p -> null != p) 
      .map(Person::getPersonChild) 
      .filter(pc -> null != pc) 
      .anyMatch(pc -> pc.isABCEDF()); 

Где isABCDEF проверяет все условия.

нет, что метод не может быть добавлен

Или вы можете добавить этот метод с лучшим описанием того, что он проверяет.

.anyMatch(pc -> isABCEDF(pc)); 

Если вы не хотите, чтобы добавить метод, который вы можете сделать то, что вы предложили

.anyMatch(c -> c.isAB() || c.isBC() || c.isCD() || c.idDE() || c.isEF()); 

Как @WanderNauta указывает также можно использовать .filter(Objects::nonNull) нулевые чеки, если вы чувствуете, что это понятнее.

+2

Или вы перепутаете последний 'filter' с' anyMatch': 'Details.stream(). Filter (Objects :: nonNull) .map (Person :: getPersonChild) .anyMatch (pc -> null! = Pc && pc. isABCEDF()) ' – Holger

+0

modList.stream(). фильтр (детали-> NULL! = подробности && нуль! = details.getPersonChild()) \t \t \t \t \t \t .map (Person :: getPersonChild) \t \t \t \t \t \t .anyMatch ((Ребенок :: isAB || Ребенок :: isBC || Ребенок :: isCD || Child.isDE || Ребенок :: isEF)); --- >> Я получаю сообщение об ошибке, когда я пишу Child :: isAB || ....он говорит, что shd должен быть функциональным интерфейсом. – Hali

+0

Точная ошибка. Целевым типом этого выражения должен быть функциональный интерфейс и красные линии под anyMatch ((Child :: isAB || Child :: isBC || Child :: isCD || Child. isDE || Child :: isEF)); – Hali

3

Другое решение:

Details.stream() 
    .filter(Objects::nonNull) 
    .map(Person::getPersonChild) 
    .filter(Objects::nonNull) 
    .anyMatch(
     ((Predicate<String>) Child::isAB). 
     or(Child::isBC). 
     or(Child::isDE). 
     or(Child::isEF) 
    ); 

Мы объединяем несколько Predicates здесь, используя Predicate.or метод:

((Predicate<String>) Child::isAB).or(Child::isBC).or(Child::isDE).or(Child::isEF) 
Смежные вопросы