2017-09-30 2 views
2

필터가 있어도 왜이 스트림이 인쇄되지 않습니다. 1?스트림 필터가 제대로 작동하지 않았습니다. 10 줄을 인쇄하고 싶습니다.

누군가 나에게 설명해 줄 수 있습니까? 이 예제는 정확하지 않으며 스트림을 조작하는 가장 좋은 예입니다. 이는 단지 학습 목적을위한 것입니다.

Stream.generate(() -> "1") 
       .peek(System.out::println) 
       .filter(x -> x.length() > 1) 
       .limit(10) 
       .forEach(System.out::println); 

올바른은 : 문서에서

Stream.generate(() -> "1") 
       .limit(10) 
       .forEach(System.out::println); 
+1

10 요소 스트림 만 원할 경우 IntStream.range (0,10)를 시작하는 것이 좋습니다. –

답변

4

스트림을 파이프 라인으로 생각하십시오. 요소는 generate 메소드에서 계속 나오게됩니다. 그런 다음 각 요소는 각 후속 작업을 통해 전달됩니다. 그래서 코드에서

: 당신의 "1""1" 경우, filter에서

  • 인쇄,

    • 새로운 "1"peek에서
    • 생성됩니다

      Stream.generate(() -> "1") 
            .peek(System.out::println) 
            .filter(x -> x.length() > 1) 
            .limit(10) 
            .forEach(System.out::println); 
      

      다음가는 유지 길이가 1보다 길면 통과 할 것이고, 그렇지 않으면 던져 버려

    • "1"이 필터를 통과하면 한계에 도달합니다. 한계는 처음 10 개의 요소 만 통과시킵니다."1"의 길이가 limit 결코 통해 충분한 요소를 할 수없는 등 터미널 작업이 아닙니다 결코 큰 1보다이기 때문에 10 요소 후에는, 멀리

    어떤 요소가 필터를 통과하지 않습니다 요소를 던질 것이다 도달하면 절대 종료되지 않습니다.

    그래서 처음 두 줄을 계속 반복합니다. limitfilter 작품의 순서를 반대로 왜

    는 지금 설명 할 것이다 :

    Stream.generate(() -> "1") 
         .peek(System.out::println) 
         .limit(10) 
         .filter(x -> x.length() > 1) 
         .forEach(System.out::println); 
    

    만 10 요소는 다음 limit 비트를 통해 올 peek에 의해 처음으로 인쇄됩니다. 그렇다면이 모든 요소는 filter을 통해 전달되지 않습니다. 그러나 이번에는 filterlimit이 아니기 때문에 10 개의 요소를 대기하기 때문에 터미널 작업에 도달합니다. 모든 것이 끝나고 더 이상 요소가 생성되지 않습니다.

  • 1

    , 당신이 그것을 물어의 무한 시퀀스를 반환 generate 방법 :

    static <T> Stream<T> generate(Supplier<T> s) 
    

    무한 순차적를 돌려줍니다 각 요소는 제공된 공급자가 생성하는 순서가 지정되지 않은 스트림입니다. 이 등

    그래서 Stream.generate(() -> "1").peek(System.out::println)은 결코 당신이있을 것이다 그러나 때문에 filter

    .filter(x -> x.length() > 1) 
    .limit(10) 
    .forEach(System.out::println); 
    
    의 아무것도 인쇄하지거야

    중지하지, 일정한 스트림을 생성하기에 적합한 임의 요소 스트림


    인쇄 1 열 번 :

    Stream.generate(() -> "1").limit(10).forEach(System.out::println); 
    // OR 
    IntStream.generate(() -> 1).limit(10).forEach(System.out::println); 
    
    +0

    네,하지만 .filter (x -> x.length()> 1)를 .limit (10)로 변경하면 10 개의 요소가 작동하고 인쇄됩니다. –

    -1

    필터링하기 전에 들여다 보면 인쇄하기 전에 필터가 적용되지 않는 것입니다.

    +0

    peek은 디버깅 목적으로 사용한다고 생각하지 않습니까? 그래서 터미널 작업이 아닙니다. –

    +0

    아마도 디버깅에 사용되지만, 첫 번째 스 니펫이 1을 무한히 인쇄하는 이유입니다. –

    +0

    그리고 .filter (x -> x.length()> 1) 및 .limit (10)의 순서를 변경하면 작동하고 10 개의 요소가 인쇄됩니다. –

    1

    실제로 무엇을 기대합니까?

    Stream.generate(() -> "1") // generates a String of length one 
          .peek(System.out::println) // prints it 
          .filter(x -> x.length() > 1) // filters those that have length bigger than one 
          .limit(10) // this is NEVER reached 
          .forEach(System.out::println); // this is NEVER reached 
    

    터미널 작업이 절대로 안되기 때문에, 스트림은 요소를 생성합니다. 영원히.

    두 번째 예제는 다른 한편으로는 고통을 겪지 않지만, filter과 제한은 없습니다.

    +3

    마지막 두 메서드에 도달하지 못했습니다 (실행 된) 올바른지 않습니다. 그것들은 실행될 것이지만, 요소의 순서는 적용될 때 비어 있습니다. – Andrew

    +1

    @ AndrewTobilko 예, 그게 무슨 뜻인지 ... 고마워요. – Eugene