繁体   English   中英

功能接口对象转换

[英]Functional Interface Object Cast

我在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)

  3. andThen将从foo内部的匿名函数中获取结果String(我仍然不理解它是否已被someObject::getSomethingWithEnumParameter ),然后返回someObject::getSomethingWithEnumParameter的值。 为什么返回类型不只是someObject::getSomethingWithEnumParameter的类型,为了便于讨论,我们将其称为Map<R,T>

如果有人可以帮助我理解这一流程,我将不胜感激。

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

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具有错误的类型-它是一个返回函数的函数。 如果你摆脱了“ r -> ”部分,那么它是有效的,只要someObject::getSomethingWithEnumParameter是一个方法SomeObject ,需要一个String ,并返回一个String 或者, foo的返回类型将需要更改为Function<CustomEnum, Function<String, String>>

如果将这两个与andThen结合使用,那么您将拥有一个接受CustomEnum并返回StringFunction ,作为pr的返回类型foo

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM