我正在玩 Java 8 和 e(fx)clipse,只是尝试一下。我正在尝试应用一个映射函数,该函数从可为 null 的字符串中删除所有 a。但是,后续的过滤器函数存在编译错误,因为 map 正在返回 Optional<Object>
而不是 Optional<String>
.
我做错了什么?
Optional.ofNullable(string)
.map( s -> s.replaceAll("a", "") )
.filter( s -> !((String) s).isEmpty() ) //notice the need for cast
.map( s -> "String: " + s )
.ifPresent(System.out::println);
最佳答案
似乎是类型推断的问题。 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);
引用:
关于java - Map 返回 Object 而不是通过后续调用推导,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19343171/