功能接口对象转换

时间:2017-01-09 21:51:42

标签: java functional-programming functional-interface

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

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

我真的不明白你如何将某些东西投射到功能界面上。这甚至意味着什么?

返回值的结果类型不是someObject的任何值。

Function<CustomEnum, String>是不是定义了一个带有CustomEnum类型并返回String的匿名函数?

我已经阅读了Function<T,R>的java文档,说实话,这比我阅读文档之前没有多大意义。

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

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

  2. foo中的匿名函数(以​​某种方式转换为someObject::toString,我不明白)应用于CustomEnum,它将从foo(someObject).apply(customEnum)初始调用传递{1}}。

  3. andThen将从foo内部的匿名函数中获取结果String(这是我仍然不明白的方式),然后返回someObject::getSomethingWithEnumParameter的值。为了便于讨论,为什么返回类型不仅仅是someObject::getSomethingWithEnumParameter的类型,我们会说它是Map<R,T>

  4. 如果有人能帮我理解这一流程,我将不胜感激。

1 个答案:

答案 0 :(得分:2)

在一个理想的世界中,这将起作用:

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

但是,Java需要一个接口类型才能从方法引用中隐式创建一个接口实例,因此需要使用显式转换来转换为Function接口类型。

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

打破它:

someObject::toString是隐含类型Function<CustomEnum, String>的方法参考。即toStringSomeObject上的一种方法,它采用CustomEnum类型的参数并返回String

r -> someObject::getSomethingWithEnumParameter的类型错误 - 它是一个返回函数的函数。如果你摆脱了&#34; r ->&#34;部分然后它是有效的,只要someObject::getSomethingWithEnumParameterSomeObject上的方法,它需要String并返回String。或者,foo的返回类型需要更改为Function<CustomEnum, Function<String, String>>

如果您将这两者与andThen结合使用,那么您的Function将获得CustomEnum并返回String,因为返回类型为foo }。