2016-06-22 3 views
1

순서대로 실행해야하는 3 개의 검사를 기반으로 첫 번째 결과를 선택해야합니다. 즉, 기준 1을 만족하는 객체가 없다면, 기준 2를 충족시키는 객체를 찾는다. 여기 내 작업 코드입니다이 코드를 개선 할 수 있습니까?

이 코드를 개선 할 수 있습니까? 모든 기준을 평가하기 위해 첫 번째 스트림을 재사용 할 수있는 방법이 있는지 확실하지 않습니다.

+2

에 오신 것을 환영합니다 스택 오버플로! 대신 http://codereview.stackexchange.com/에 게시하는 것을 고려하십시오. (또한 "optional"태그는 프로그래밍에서 optionals의 개념을 참조합니다) –

+1

@PWhite findFirst()는 Optional을 반환하고 orElseGet은 Optional 클래스의 메서드입니다. 그러므로 OP는 'optional'이라는 태그를 포함하는 것이 옳았다. –

+1

'() -> {return expression;을 쓰지 않아도된다는 것에주의하십시오. }', 간단한'() -> expression'이면 충분하다; 중첩 된 람다에도 적용됩니다 ... – Holger

답변

6

나는 논리에서 기준의 목록을 분리하는 것 :

List<Predicate<MyClass>> criteria = Arrays.asList(
    MyCass::meetsCriterion1, 
    MyCass::meetsCriterion2, 
    MyCass::meetsCriterion3 
); 


MyClass result = criteria.stream() 
    .flatMap(c -> myObjects.stream().filter(c).limit(1)) 
    .findFirst() 
    .orElse(null); // questionable. consider redesigning to avoid null. 
+0

멋지게 완료되었습니다. +1은 "null을 피하기 위해 재 설계를 고려하십시오." –

관련 문제