map()方法的通配符泛型



这是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));
}
}

当我这样调用map()时,TU的类型是什么?通配符(?(的类型是什么?这很令人困惑。

Optional<String> os1 = Optional.of("Optional String");
Optional<String> os2 = os1.map(s -> s.toUpperCase());

Javadoc声明称:

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

">映射函数"是指map()方法还是map()的自变量?

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

">映射函数"是指map()方法还是map()的自变量?

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

在您的示例中,TU都是String,因为您将String映射到它的大写变体,也就是String。它的行为与UnaryOperator<T>相同——Function<T, T>的一种特殊情况,它消耗并返回相同的类型。

另一方面,如果你绘制地图:

os1.map(s -> s.length())
  • T就是String
  • UInteger,因为方法String::length产生一个整数

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

Optional<String> os2 = os1.map(String::toUpperCase);

或者更好地同时使用两个Optional

Optional<String> os1 = Optional.of("Optional String");
.map(String::toUpperCase);

首先,只是为了回答您的问题:

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

此"映射函数"是指提供给Optional<T>类型的map方法的参数。

为了让事情更容易理解,暂时忘记通配符(?(,因为我们可以不混淆它,并将重点放在类型TU上,简化版本如下:

public <U> Optional<U> map(Function<T, U> mapper) { ... }
  • 其中T表示任何类型的对象作为输入,U表示任何类型作为输出
  • Function<T, U> mapper表示采用T类型的对象的函数,并返回U类型的值
  • CCD_ 43是封装类型为CCD_ 44的对象的可选

您可以将映射器函数可视化为:

_ _ _ _ _ _ _ _ _ 
|                 |
|                 |
T ----->|      logic      | -----> U
|                 |
|_ _ _ _ _ _ _ _ _|

因此,给定上面的可视化和你的例子:

Optional<String> os1 = Optional.of("Optional String");
Optional<String> os2 = os1.map(s -> s.toUpperCase());

传递给Optional类型(s -> s.toUpperCase()(的map方法的函数为Function<String, String> mapper,即,上面可视化中的T变为String,上面可视化的U变为String,即

_ _ _ _ _ _ _ _ _ 
|                 |
|                 |
String -->|      logic      | ---> String
|                 |
|_ _ _ _ _ _ _ _ _|

因此,当上述函数被Optional类型的map方法调用时,它将在可视化中执行由上述"逻辑"表示的一些操作,在这种特定情况下,逻辑只是将输入字符串转换为大写字符串。

完成后,Optional<T>类型的map方法将该大写字符串封装到一个Optional对象中,因此它返回一个Optional<String>

在我看来,您的JDK的src(带有Javadoc(项目错误。考虑一下Oracle文档中关于Java 8中可选的内容:

映射(函数映射器(

如果存在值,则将提供的映射函数应用于该值,并且如果结果不是null,则返回一个描述结果的Optional。

最新更新