## Why is this an issue?

According to its JavaDocs, the intermediate Stream operation `java.util.Stream.peek()` “exists mainly to support debugging” purposes.

A key difference with other intermediate Stream operations is that the Stream implementation is free to skip calls to `peek()` for optimization purpose. This can lead to `peek()` being unexpectedly called only for some or none of the elements in the Stream.

As a consequence, relying on `peek()` without careful consideration can lead to error-prone code.

This rule raises an issue for each use of peek() to be sure that it is challenged and validated by the team to be meant for production debugging/logging purposes.

### Noncompliant code example

    Stream.of("one", "two", "three", "four")
             .filter(e -> e.length() > 3)
             .peek(e -> System.out.println("Filtered value: " + e)); // Noncompliant

### Compliant solution

    Stream.of("one", "two", "three", "four")
             .filter(e -> e.length() > 3)
             .foreach(e -> System.out.println("Filtered value: " + e));

## Resources

- Java 8 API Documentation
- 4comprehension: Idiomatic Peeking with Java Stream API
- Data Geekery: 10 Subtle Mistakes When Using the Streams API