gpt4 book ai didi

Java8 : Is there a way to get an instance method reference from a class method reference?

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:58:15 24 4
gpt4 key购买 nike

例如,如果我有这样的界面:

public interface FooBar<A, B> {
B foo(A a);

B bar(A a);
}

有没有办法像FooBar::bar那样获取类级别的方法引用?并获取实例方法引用?

即。如果我有

FooBar myFooBarInstance;
BiFunction<FooBar<A, B>, A, B> barFunction = FooBar::bar;

有什么简单的方法可以得到 Function<A,B>与我定义的实例相匹配的实例

Function<A, B> myBarFunction = myFooBarInstance::bar;

最佳答案

您想要做的在函数编程世界中被称为“部分函数应用程序”,或者用更简单的术语来说就是“将值绑定(bind)到参数”。没有内置方法,但很容易编写自己的方法:

public static <T,U,R> Function<U,R> bind(BiFunction<T,U,R> f, T t) {
return u -> f.apply(t, u);
}

然后你就可以在你的情况下使用它了:

FooBar<X,Y> instance=…;
BiFunction<FooBar<X,Y>,X,Y> barFunction=FooBar::bar;
Function<X,Y> myBarFunction=bind(barFunction, instance);

或者只是

// equivalent to myBarFunction=instance::bar
Function<X,Y> myBarFunction=bind(FooBar::bar, instance);

请注意,实用程序方法与您正在使用的功能接口(interface)紧密相关,即 FunctionBiFunction,而不是方法引用。它适用于任何 BiFunction,无论是作为方法引用、lambda 表达式还是普通类实现。但它只有在您特别需要一个 Function 实例时才有用,而不是用于采用一个参数的任意功能接口(interface)。您可以使用 ::applyFunction 转换为另一个单参数函数类型,但使用 bind(bifunc, value)::apply 不会与 x -> bifunc.apply(value, u) 相比,在需要实例的地方没有任何好处。

因此,如果您必须经常通过绑定(bind)第一个参数将 BiFunction 转换为 Function,实用程序方法可能会有用。否则,只需在实际目标类型存在的上下文中使用 lambda 表达式。当然,您也可以为其他接口(interface)编写类似的方法,但只有当您经常需要针对特定​​接口(interface)使用它时,这才有用。

关于参数较多的函数,由于Java API没有提供这样的函数接口(interface),需要自己定义合适的接口(interface),这提供了直接在接口(interface)中提供绑定(bind)函数的选项default 方法,例如

interface MyFunc3<A,B,C,R> {
R apply(A a, B b, C c);
default BiFunction<B,C,R> bind(A a) {
return (b, c) -> apply(a, b, c);
}
}
interface MyFunc4<A,B,C,D,R> {
R apply(A a, B b, C c, D d);
default MyFunc3<B,C,D,R> bind(A a) {
return (b, c, d) -> apply(a, b, c, d);
}
}

那么,如果你有这样的函数

MyFunc4<U, W, X, Y, Z> func = …;

你可以做类似的事情

MyFunc3<W, X, Y, Z> f3 = func.bind(u);

BiFunction<X, Y, Z> f2 = func.bind(u).bind(w);

关于Java8 : Is there a way to get an instance method reference from a class method reference?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35931134/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com