Вы не должны этого делать, потому что это может означать, что операция может изменить конечный результат, потому что идемпотентная операция может изменить объект, на котором она работает .
В следующем примере используется идемпотентная операция внутри метода peek()
, но изменяет результат (что не является хорошей практикой в соответствии с указанной вами документацией)
import java.util.Set;
import java.util.stream.Collectors;
import java.util.stream.Stream;
class SomeClass {
private String state = "some-value";
public void idempotent() {
state = "other-value";
}
@Override
public String toString() {
return "SomeClass{" +
"state='" + state + '\'' +
'}';
}
}
public class Idempotent {
public static void main(String[] args) {
Set<SomeClass> collect = Stream.of(new SomeClass(), new SomeClass())
.peek(SomeClass::idempotent)
.collect(Collectors.toSet());
System.out.println(collect);
}
}
До операции peek()
поток состоит из ["some-value", "some-value]
, а после peek()
с идемпотентной операцией он состоит из ["other-value", "other-value"]
.