Returns the result of applying this function to {@code input}. This method is
generally expected, but not absolutely required, to have the following properties:
- Its execution does not cause any observable side effects.
- The computation is consistent with equals; that is, {@link Objects#equal Objects.equal}{@code (a, b)} implies that {@code Objects.equal(function.apply(a),function.apply(b))}.
@throws NullPointerException if {@code input} is null and this function does not accept nullarguments