map()方法的通配符泛型

NBl*_*izz 7 java generics lambda optional java-8

这是map()方法的实现:

public <U> Optional<U> map(Function<? super T, ? extends U> mapper) {
    Objects.requireNonNull(mapper);
    if (!isPresent()) {
        return empty();
    } else {
        return Optional.ofNullable(mapper.apply(value));
    }
}
Run Code Online (Sandbox Code Playgroud)

当我这样打电话时map(),TU?的类型是什么?wildcard(?)的类型是什么?这非常令人困惑.

Optional<String> os1 = Optional.of("Optional String");
Optional<String> os2 = os1.map(s -> s.toUpperCase());
Run Code Online (Sandbox Code Playgroud)

Javadoc声明说:

@param <U>是映射函数返回的值的类型.

" 映射函数 "是指map()方法还是参数map()

Nik*_*las 7

无论是否,Stream或者接受Optional的方法的目的是将每个输入值映射到相同或不同类型的输出.通配符用于扩展映射可能性的范围.mapFunction<? super T, ? extends U>TU

" 映射函数 "是指map()方法还是参数map()

" 映射函数 "是T- > 接口U的匿名类的映射实现,Function可以使用lambda表达式或方法引用缩短.

在您的样品中,T并且U都是String因为你映射String到其大写的变化,这是String一次.它的行为与消耗和返回相同类型UnaryOperator<T>的特殊情况Function<T, T>相同.

另一方面,如果您映射:

os1.map(s -> s.length())
Run Code Online (Sandbox Code Playgroud)
  • TISString
  • UInteger,因为该方法String::length产生的整数

您可以使用方法引用缩短lambda:

Optional<String> os2 = os1.map(String::toUpperCase);
Run Code Online (Sandbox Code Playgroud)

......或者更好地将两者Optional结合在一起:

Optional<String> os1 = Optional.of("Optional String");
                               .map(String::toUpperCase);
Run Code Online (Sandbox Code Playgroud)