我在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文档,说实话,这比我阅读文档之前没有多大意义。
这是我认为正在发生的事情。
foo返回一个匿名函数,该函数应用于某些CustomEnum
以返回一个字符串
foo中的匿名函数(以某种方式转换为someObject::toString
,我不明白)应用于CustomEnum
,它将从foo(someObject).apply(customEnum)
初始调用传递{1}}。
andThen
将从foo内部的匿名函数中获取结果String(这是我仍然不明白的方式),然后返回someObject::getSomethingWithEnumParameter
的值。为了便于讨论,为什么返回类型不仅仅是someObject::getSomethingWithEnumParameter
的类型,我们会说它是Map<R,T>
。
如果有人能帮我理解这一流程,我将不胜感激。
答案 0 :(得分:2)
在一个理想的世界中,这将起作用:
public Function<CustomEnum,String> foo(SomeObject someObject) {
return (someObject::toString).andThen(...);
}
但是,Java需要一个接口类型才能从方法引用中隐式创建一个接口实例,因此需要使用显式转换来转换为Function接口类型。
一旦你有了一个Function实例,你可以按照正常情况调用它上面的任何方法,在这种情况下是andThen
方法,它与另一个函数对象组成它以形成一个新函数。
打破它:
someObject::toString
是隐含类型Function<CustomEnum, String>
的方法参考。即toString
是SomeObject
上的一种方法,它采用CustomEnum
类型的参数并返回String
。
r -> someObject::getSomethingWithEnumParameter
的类型错误 - 它是一个返回函数的函数。如果你摆脱了&#34; r ->
&#34;部分然后它是有效的,只要someObject::getSomethingWithEnumParameter
是SomeObject
上的方法,它需要String
并返回String
。或者,foo
的返回类型需要更改为Function<CustomEnum, Function<String, String>>
。
如果您将这两者与andThen
结合使用,那么您的Function
将获得CustomEnum
并返回String
,因为返回类型为foo
}。