| From the javadoc for | |
| [`java.util.stream: Non-interference`](https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/util/stream/package-summary.html#NonInterference): | |
| > Accordingly, behavioral parameters in stream pipelines whose source might not | |
| > be concurrent should never modify the stream's data source. A behavioral | |
| > parameter is said to interfere with a non-concurrent data source if it | |
| > modifies, or causes to be modified, the stream's data source. The need for | |
| > non-interference applies to all pipelines, not just parallel ones. Unless the | |
| > stream source is concurrent, modifying a stream's data source during execution | |
| > hg of a stream pipeline can cause exceptions, incorrect answers, or | |
| > nonconformant behavior. | |
| That is, prefer this: | |
| ```java | |
| mutableValues.stream() | |
| .filter(x -> x < 5) | |
| .collect(Collectors.toList()) // Terminate stream before source modification. | |
| .forEach(mutableValues::remove); | |
| ``` | |
| to this: | |
| ```java | |
| mutableValues.stream() | |
| .filter(x -> x < 5) | |
| .forEach(mutableValues::remove); | |
| ``` |