似乎是类型推断的问题。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);
参考: