On Tue, 17 Oct 2023 08:05:09 GMT, Per Minborg <pminb...@openjdk.org> wrote:

> This PR proposes to add a number of "capturing factories" in classes in the 
> `java.util.function` package.
> 
> The PR additionally (an optionally) proposes to add a new function 
> `UnaryOperator::andThenUnary` to allow composition while retaining the 
> `UnaryOperator` type.
> 
> With the new changes, it is possible to write code like this (example from 
> `java.util.function.Function`):
> 
> 
> // Resolve ambiguity
> var function = Function.of(String::isEmpty); // Function<String, Boolean>
> var predicate = Predicate.of(String::isEmpty); // Predicate<String>
> 
> // Fluent composition
> var chained = Function.of(String::length)       // Function<String, Integer>
>                    .andThen(Integer::byteValue);      // Function<String, 
> Byte>
> 
> 
> Please see the original bug report for a comprehensive description of these 
> proposed changes.
> 
> Note: It is not the objective to promote `var` declaration or to prevent 
> previous ways of capturing lambdas and method references. The comments in the 
> code above is for explaining the binding and once that becomes obvious, such 
> comments are likely to not appear in real code. Users that prefers having a 
> normal type declaration can still do that.
> 
> Note: Functional interfaces of primitives have not been considered (in this 
> round). Otherwise, functional interfaces that might be ambiguous or that 
> supports composition have been included. Hence, `Supplier` did not get a 
> factory method.

The factory methods should probably use bounded wildcards.

src/java.base/share/classes/java/util/function/BiConsumer.java line 104:

> 102:      * @param <U> the type of the second argument to the operation
> 103:      */
> 104:     static <T, U> BiConsumer<T, U> of(BiConsumer<T, U> uncaptured) {

Suggestion:

    static <T, U> BiConsumer<T, U> of(BiConsumer<? super T, ? super U> 
uncaptured) {

src/java.base/share/classes/java/util/function/BiFunction.java line 94:

> 92:      * @param <R> the type of the result of the function
> 93:      */
> 94:     static <T, U, R> BiFunction<T, U, R> of(BiFunction<T, U, R> 
> uncaptured) {

Suggestion:

    static <T, U, R> BiFunction<T, U, R> of(BiFunction<? super T, ? super U, ? 
extends R> uncaptured) {

src/java.base/share/classes/java/util/function/BiPredicate.java line 128:

> 126:      * @param <U> the type of the second argument the predicate
> 127:      */
> 128:     static <T, U> BiPredicate<T, U> of(BiPredicate<T, U> uncaptured) {

Suggestion:

    static <T, U> BiPredicate<T, U> of(BiPredicate<? super T, ? super U> 
uncaptured) {

src/java.base/share/classes/java/util/function/Consumer.java line 87:

> 85:      * @param <T> the type of the input to the operation
> 86:      */
> 87:     static <T> Consumer<T> of(Consumer<T> uncaptured) {

Suggestion:

    static <T> Consumer<T> of(Consumer<? super T> uncaptured) {

src/java.base/share/classes/java/util/function/Function.java line 121:

> 119:      * @param <R> the type of the result of the function
> 120:      */
> 121:     static <T, R> Function<T, R> of(Function<T, R> uncaptured) {

Suggestion:

    static <T, R> Function<T, R> of(Function<? super T, ? extends R> 
uncaptured) {

src/java.base/share/classes/java/util/function/Predicate.java line 160:

> 158:      * @param <T> the type of the input to the predicate
> 159:      */
> 160:     static <T> Predicate<T> of(Predicate<T> uncaptured) {

Suggestion:

    static <T> Predicate<T> of(Predicate<? super T> uncaptured) {

-------------

PR Review: https://git.openjdk.org/jdk/pull/16213#pullrequestreview-1682167914
PR Review Comment: https://git.openjdk.org/jdk/pull/16213#discussion_r1362019934
PR Review Comment: https://git.openjdk.org/jdk/pull/16213#discussion_r1362020142
PR Review Comment: https://git.openjdk.org/jdk/pull/16213#discussion_r1362020330
PR Review Comment: https://git.openjdk.org/jdk/pull/16213#discussion_r1362020494
PR Review Comment: https://git.openjdk.org/jdk/pull/16213#discussion_r1362020680
PR Review Comment: https://git.openjdk.org/jdk/pull/16213#discussion_r1362020826

Reply via email to