这是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()
时,T
和U
的类型是什么?通配符(?
(的类型是什么?这很令人困惑。
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表达式或方法引用缩短。
在您的示例中,T
和U
都是String
,因为您将String
映射到它的大写变体,也就是String
。它的行为与UnaryOperator<T>
相同——Function<T, T>
的一种特殊情况,它消耗并返回相同的类型。
另一方面,如果你绘制地图:
os1.map(s -> s.length())
T
就是String
U
是Integer
,因为方法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
方法的参数。
为了让事情更容易理解,暂时忘记通配符(?
(,因为我们可以不混淆它,并将重点放在类型T
和U
上,简化版本如下:
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。