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(),T和U?的类型是什么?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()?
无论是否,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)
TISStringU是Integer,因为该方法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)