As traditional , the “impure” code of page 207 in the form of a pretend test.
(Doesn’t “impure” refer to performing uncontrolled side effects, like printing to Stdout in the middle of a function though? Here, the lambda of the of the map is really a function of two parameters, one of which is pulled from the context, but it being mutable ruins everything. The key is presence of mutability.
Suppose we have a lambda expression that depends on a field in a class.
That’s okay!
Suppose we have a lambda expression that depends on a mutable (non final) member in a surrounding context.
That’s not okay!
package chapter12; import org.junit.jupiter.api.Test; import java.util.List; import java.util.stream.Collectors; public class Impure { private int factor = 2; // it's mutable, which is bad (it's not even volatile either) @Test void impureFunction() { final var numbers = List.of(1, 2, 3); final var stream = numbers.stream() .map(number -> number * factor); factor = 0; System.out.println(stream.collect(Collectors.toList())); } } The output here happens to be [0, 0, 0].