2014-12-24 3 views
2

IntStream::noneMatch의 Javadoc을 읽었습니다.IntStream :: noneMatch가 스트림의 모든 요소에서 조건자를 평가할 수 있습니까?

은 말한다 :이 스트림의 어떤 요소가 제공 조건과 일치하지

반환 여부를 지정합니다. 결과 판별에 필요하지 않은 경우 모든 요소에 대한 술어를 평가할 수 없습니다. 스트림이 비어 있으면 true를 반환하고 조건자를 평가하지 않습니다.

noneMatch 스트림의 모든 요소에 술어를 평가하고 어디에 noneMatch false를 반환하는 경우 (참 반환하지 않습니다있는 실제 시나리오가 있는지 궁금 해서요,이 술어 만 평가되는 것이 분명하다 첫 번째 경기가 발견 될 때까지 요소에).

내가 생각할 수있는 유일한 시나리오는 스트림 파이프 라인에 술어가 noneMatch의 술어와 정확히 일치하는 필터가있는 경우 아마도 어떤 요소도 테스트하지 않고 noneMatch이 true를 반환한다는 것입니다. 다음 코드를 테스트 할 때

그러나 :

boolean out = IntStream.range(1, 10000) 
        .filter(i -> i % 2 == 0) 
                  .peek(System.out::println) 
                  .noneMatch(i -> i % 2 == 1); 
System.out.println(out); 

I는 9998 2부터 짝수의 출력을 얻을 : 전체 스트림을 의미

2 
4 
6 
... 
9998 
true 

평가, 비록 필터는 정수만 반환하며, noneMatch의 조건부는 홀수 인 정수가 필요하지 않으므로 요소를 평가하지 않고 true를 반환 할 수 있어야합니다.

그래서 Javadoc이 May not evaluate on all elements.이라고하면 noneMatch이 false를 반환하는 경우 만 참조할까요?

편집 :

난 그냥 내 질문은 명확히 싶어

하지 이유가 게시 된 코드는 전체 스트림을 평가한다. 제 질문은 전체 스트림을 평가하지 않고 noneMatch의 결과를으로 반환하는 시나리오가 있는지 여부입니다..

+0

음, * 힘을 * 일 이후 버전 모순 검출 할 수있는 경우에 당신은 당신의 코드를 변경하는 경우 예를 들어

, '술어'. 아니면 미래의 API는'Stream.filter'에 전달 될 때 인식 될'Predicate.matchNone' 상수를가집니다. 또는'map' 연산이 입력에 의존하지 않는 함수를 가질 때 인식 할 수 있습니다 (이 경우 단일 요소를 검사하면 전체 결과를 결정할 수 있습니다). – Holger

답변

4

그래서 그것은 모든을 확인하는, 요소의 없음이 일치하는지 확인하기 위해, 어떤 요소

없음

을 평가하지 않고 true를 반환 할 수 있어야한다. 즉, true을 반환하면 확실히 모든 것을 살펴볼 것입니다. 다시 말해, 논리는 술어가하는 것에 의존하므로 어떤 요소를 평가하지 않고 어떻게 리턴 할 수 있습니까? 술어가 적용되지 않는다는 것을 의미합니까?

모든 요소를 ​​평가하지 않고 true을 반환 할 수있는 유일한 방법은 형식의 스트림과 술어에 대해 알아야합니다.예를 들어, 스트림이 UUID 참조 스트림이고 "술어"가 일치하는 문자열을 "알았다"면 사물을 평가할 필요가 없습니다. 그러나 그런 종류의 최적화를 시도하는 것은 의심 스럽습니다.

과 일치하는 항목을 찾으면 나머지 항목을 보지 않고 false을 반환 할 수 있습니다. 당신의 출력을 얻을 것이다 다음

boolean out = IntStream.range(1,10000) 
       .peek(System.out::println) 
       .noneMatch(i->i%4==3); 
System.out.println(out); 

:

1 
2 
3 
false 
+0

그럼, 결과를 결정할 필요가 없다면 모든 요소에 대한 술어를 평가하지 못할 수도 있습니다 .'' noneMatch'가 false를 반환하는 경우에만 적용됩니다. Javadoc은 명시 적으로 말하지 않기 때문에 모든 요소를 ​​평가하지 않고 반환되는 경우가 있을지 궁금해했습니다. – Eran

+1

@Eran : * 가능한 시나리오로 내 대답을 편집했지만 실제로 구현 된 것 같지 않습니다. 그리고 분명히 여러분이 준 예제에는 적용되지 않습니다. –