2016-06-25 3 views
-3

(*)forEach과의 차이점은 무엇입니까? 산출물은 무엇이며 그 이유는 무엇입니까? 나는 알지 못한다. forEach 아무것도 인쇄되지 않을 것이다. 그러나 왜 엿봄이 필요한가? 내가 peek에 대한 알다시피Java 스트림, forEach의 유무에 관계없이

당신은, 그러나 여기에 할 것 같다하지 않습니다 ... 아무것도 할 System.out.println에 대한 결과 스트림과 뭔가를해야하고, 그것은 여전히 ​​.... 실행

public class NaturalNumbers 
     implements Supplier<Integer> { 
private int i = 0; 
public Integer get() { return ++i; } 
} 

public static void main(String[] args) { 
Stream<Integer> s = 
       Stream.generate(new NaturalNumbers()); 

s.limit(5) 
    .peek(System.out::println) 
    .forEach(System.out::println);/// ׂ (*) 
{ 
+1

* 출력 내용 * : 코드를 실행하고 직접 보지 않으시겠습니까? 그런 다음 설명서를 읽고 이유를 이해하십시오. 제거 할 때마다 일어날 것으로 예상되는 것은 무엇입니까? –

+0

ji는'for each '의 부작용에 대해 먼저 확인해야한다고 생각합니다 (https://docs.oracle.com/javase/8/docs/api/java/util/stream/package-summary.html) – emotionlessbananas

답변

2

peek은 스트림 내에서 peek의 방법 일 뿐이지 만 변경되지는 않지만 스트림의 모든 요소를 ​​수신합니다.

forEach은 스트림의 모든 데이터를 사용하고 void을 반환하는 터미널 연산입니다.

위 코드의 결과는 각 숫자가 두 번 인쇄 될 때 peek을 제거하면 한 번만 인쇄됩니다.

forEach을 제거하면 터미널 작업 (예 : forEach, count)이 발생할 때까지 스트림이 작업을 실행하지 않으므로 아무런 결과도 출력되지 않습니다.

+0

제거하면 'forEach'는 스트림에서 항목을 소비하는 터미널 액션이 없기 때문에 숫자가 인쇄되지 않습니다. –

+0

@MarkRotteveel 맞아, 그거 잊어 버렸어, 내 대답이 업데이트 됐어. –

2

터미널과 중간 작업이라는 개념이 있습니다. 터미널 작업이 마지막 단계이므로 모든 중간 작업이 처리됩니다. 픽은 터미널 작업이 아닙니다.

Stream.of("one", "two", "three", "four") 
      .filter(e -> e.length() > 3) 
      .peek(e -> System.out.println("Filtered value: " + e)) 
      .map(String::toUpperCase) 
      .peek(e -> System.out.println("Mapped value: " + e)) 
      .collect(Collectors.toList()); 

그리고 그래, 내가 방법 엿 내부의 javadoc보고를 권하고 싶습니다 : 방법이 터미널 작업입니다 경우에도 https://docs.oracle.com/javase/8/docs/api/java/util/stream/Stream.html

https://docs.oracle.com/javase/tutorial/collections/streams/

어떻게 알이 문서를 읽기 또는 중간체? 간단히 말해서 중간 작업은 항상 스트림 클래스를 반환하지만 터미널 작업은 다양한 개체를 반환 할 수 있습니다. - 선택적 클래스, 일부 컬렉션, 프리미티브 등.

관련 문제