似乎是类型推断的问题。Optional.map
接受一个类型的参数Function<? super T, ? extend U>
并返回一个Optional<U>
.
现在String
,类型T
被推断为String
,并且U
被推断为Object
,这就是它返回的原因Optional<Object>
。我没有过多地使用 Java 8,但我想这就是正在发生的事情。
您可以Optional<String>
通过给出显式类型参数来获得:
Optional.ofNullable(string).<String>map(s -> s.replaceAll("a", ""))
.filter(s -> s.isEmpty())
.map(s -> "String" + s)
.ifPresent(System.out::println);
<String>
在.
和之间map(...)
表示一个显式类型参数,以确保类型参数U
被推断为String
.
坦率地说,我本来希望在没有显式类型参数的情况下工作,因为Function
传递给map
的输入和输出类型都为String
:
s (type is String) -> s.replaceAll(..) (this also returns String)
并且因为,String
同时满足边界 -? extends T
和? super U
. 记住在泛型中,String super String
并且String extends String
是true
. 所以,我很惊讶为什么它没有按预期工作。但同样,对于这些惊喜,我猜,Java 有明确的类型参数。
注意:所以原来是eclipse的问题。原始代码在命令行上运行良好。
Function<T, R>
另一种选择是预先创建一个对象,然后传递它:
Function<String, String> func = s -> s.replaceAll("a", "");
Optional.ofNullable(string).map(func)
.filter(s -> s.isEmpty())
.map(s -> "String" + s)
.ifPresent(System.out::println);
参考: