@UnstableApi
    public AbstractClientOptionsBuilder contextCustomizer(
            Consumer<? super ClientRequestContext> contextCustomizer) {
        requireNonNull(contextCustomizer, "contextCustomizer");
        if (this.contextCustomizer == null) {
            //noinspection unchecked
            this.contextCustomizer = (Consumer<ClientRequestContext>) contextCustomizer;
        } else {
            this.contextCustomizer = this.contextCustomizer.andThen(contextCustomizer);
        }
        return this;
    }
Adds the specified {@link ClientRequestContext} customizer function so that
it customizes the context in the thread that initiated the client call.
The given customizer function is evaluated before the customizer function specified by
{@link Clients#withContextCustomizer(Consumer)}.

<pre>{@code
static final ThreadLocal<String> USER_ID = new ThreadLocal<>();
static final AttributeKey<String> USER_ID_ATTR = AttributeKey.valueOf("USER_ID");
...
MyClientStub client =
    Clients.builder(...)
           .contextCustomizer(ctx -> {
               // This customizer will be invoked from the thread that initiates a client call.
               ctx.setAttr(USER_ID_ATTR, USER_ID.get());
           })
           .build(MyClientStub.class);

// Good:
// The context data is set by the thread that initiates the client call.
USER_ID.set("user1");
try {
    client.executeSomething1(..);
    ...
    client.executeSomethingN(..);
} finally {
    // Should clean up the thread local storage.
    USER_ID.remove();
}

// Bad:
USER_ID.set("user1");
executor.execute(() -> {
    // The variable in USER_ID won't be propagated to the context.
    // The variable is not valid at the moment client.executeSomething1() is called.
     client.executeSomething1(..);
});
}</pre>

<p>Note that certain properties of {@link ClientRequestContext}, such as:
<ul>
  <li>{@link ClientRequestContext#endpoint()}</li>
  <li>{@link ClientRequestContext#localAddress()}</li>
  <li>{@link ClientRequestContext#remoteAddress()}</li>
</ul>
may be {@code null} while the customizer function runs, because the target host of the {@link Request}
is not determined yet.

@see Clients#withContextCustomizer(Consumer)
core/src/main/java/com/linecorp/armeria/client/AbstractClientOptionsBuilder.java