【问题标题】:Functional Interface Object Cast功能接口对象转换
【发布时间】:2017-07-21 03:44:12
【问题描述】:

我在一个 Java 项目中遇到过以下代码,我不知道该怎么做:

public Function<CustomEnum,String> foo(SomeObject someObject) {
    return ((Function<CustomEnum,String>) (someObject::toString)).andThen(r -> someObject::getSomethingWithEnumParameter);
}

我真的不明白如何将某些东西转换为功能接口。这到底是什么意思?

返回值的结果类型不会是 someObject 的任何值吗?

Function&lt;CustomEnum, String&gt; 不是定义了一个匿名函数,它接受 CustomEnum 类型并返回 String

我已经阅读了Function&lt;T,R&gt; 的 java 文档,老实说,这与我阅读文档之前相比没有多大意义。

这就是我认为正在发生的事情。

  1. foo 正在返回一个匿名函数,该函数应用于某些 CustomEnum 以返回一个字符串

  2. foo 内部的匿名函数(不知何故被强制转换为someObject::toString,我不明白)应用于CustomEnum,它将从foo(someObject).apply(customEnum) 的初始调用传递。

  3. andThen 将从 foo 内部的匿名函数中获取结果字符串(我仍然不明白它以某种方式强制转换),然后返回 someObject::getSomethingWithEnumParameter 的值。为什么返回类型不只是 someObject::getSomethingWithEnumParameter 的类型,为了讨论,我们会说是 Map&lt;R,T&gt;

如果有人能帮助我理解这个流程,我将不胜感激。

【问题讨论】:

  • 该代码令人讨厌,如果该开发人员在我的团队中,我会与他/她进行认真的交谈。实现这一点的正确方法是创建一个单独的方法,其主体为return someObject.getSomethingWithEnumParam(someObject.toString());,因此对该方法的简单引用可以用作函数。

标签: java functional-programming functional-interface


【解决方案1】:

在理想的世界中,这会起作用:

public Function<CustomEnum,String> foo(SomeObject someObject) {
    return (someObject::toString).andThen(...);
}

然而,Java 需要接口类型才能从方法引用隐式创建接口实例。因此,需要显式转换才能转换为 Function 接口类型。

一旦你有了一个 Function 的实例,你就可以照常调用它的任何方法,在这种情况下,andThen 方法将它与另一个函数对象组合以形成一个新函数。

分解:

someObject::toString 是隐含类型Function&lt;CustomEnum, String&gt; 的方法引用。 IE。 toStringSomeObject 上的一个方法,它接受CustomEnum 类型的参数并返回String

r -&gt; someObject::getSomethingWithEnumParameter 有错误的类型 - 它是一个返回函数的函数。如果您去掉“r -&gt;”部分,那么它是有效的,只要someObject::getSomethingWithEnumParameterSomeObject 上的一个方法,它接受String 并返回String。或者,foo 的返回类型需要更改为 Function&lt;CustomEnum, Function&lt;String, String&gt;&gt;

如果您将这两者与andThen 结合起来,那么您有一个Function,它接受一个CustomEnum 并返回一个String,作为foo 的返回类型。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-24
    • 2016-08-02
    • 1970-01-01
    相关资源
    最近更新 更多