java - Map 返回 Object 而不是通过后续调用推导

标签 java eclipse java-8

我正在玩 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 StringString extends Stringtrue .因此,令我惊讶的是为什么它没有按预期工作。但是同样,我猜只是为了这些惊喜,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/

相关文章:

java-8 - 如何从kotlin传递suplier?

java - 通过鼠标右键单击 Windows 执行带有参数的 .jar 文件?

java - 如何检测 HttpServletRequest 的 TLS 版本?

java - 如何在对象映射器中将时间戳映射到日期

eclipse - Eclipse中的Maven插件-缺少Settings.xml文件

java - 在开发 Eclipse 插件时如何以编程方式控制/获取 JUnit View ?

java - 2 个不同的 eclipse 安装是否使用不同的 JVM?

java-8 - 使用 Files.lines 修改文件

java - 如何使用流在没有冗余代码的情况下获取嵌套集合的最小/最大元素?

java - 反射 : returning wrong fields