Java8方法参考

Java8方法参考,java,java-8,Java,Java 8,在Java8中,是否可以在一行中调用2个引用方法 customer::new::getName 可以连接形式的2个引用方法: a::b::c 不,您不能链接两个方法引用 基本上,方法引用是一种语法糖,它允许您将现有方法的定义传递给Lambda表达式(它实现单个抽象方法) 在Java8中,是否可以在一行中调用2个引用方法 customer::new::getName 不,在使用方法引用时不可能链接方法,因为方法引用本质上是只执行一个方法的lambda表达式的简写语法。因此,一旦开始链接方法,

在Java8中,是否可以在一行中调用2个引用方法

customer::new::getName
可以连接形式的2个引用方法:

a::b::c

不,您不能链接两个方法引用

基本上,方法引用是一种语法糖,它允许您将现有方法的定义传递给Lambda表达式(它实现单个
抽象
方法)

在Java8中,是否可以在一行中调用2个引用方法

customer::new::getName
不,在使用方法引用时不可能链接方法,因为方法引用本质上是只执行一个方法的lambda表达式的简写语法。因此,一旦开始链接方法,它就不再是方法引用的有效语法

语法

Object::methodName
如何内联两个方法引用表达式? 让我们分解
Customer::new::getName
表达式

T1 customer = Customer::new;
T2 name = customer::getName; 
根据所述方法参考表达式,因此必须使用
T1
T2

如果T是函数接口类型(§9.8),且表达式与从T派生的基本目标类型的函数类型一致,则方法引用表达式在赋值上下文、调用上下文或转换上下文中与目标类型T兼容

Supplier
T1
一起使用时,编译器会报告错误:无法解析在Supplier上定义的方法getName。但您可以定义自己的功能界面,例如:
CustomerSupplier

interface CustomerSupplier {
    Customer get();

    default String getName() {
        return get().getName();
    }
}
Supplier<String> customerName = ((CustomerSupplier) Customer::new)::getName;
然后您可以将
Customer::new
引用到
CustomerSupplier

CustomerSupplier customer = Customer::new;
Supplier<String> name = customer::getName;
然而最简单的方法是直接访问由提供的服务

但是可以引入一种方法来避免引入由提供的用于组合函数接口的类型

私有供应商映射(供应商目标、功能映射器){
return()->mapper.apply(target.get());
}
供应商customerName=map(客户::新建,客户::getName);
否,但请参阅以获取替代方案。新客户()的问题可能重复。getName()
()->a.b().c()
interface Reference<T> extends Supplier<T> {
    static <T> Reference<T> of(Supplier<T> reference) {
        return reference::get;
    }

    default <R> Reference<R> of(Function<T, R> after) {
        return () -> after.apply(get());
    }
}

//NOTE:Reference is derived from Supplier, so it is compatible with Supplier.  
Supplier<String> customerName = Reference.of(Customer::new).of(Customer::getName);
private <T, R> Supplier<R> map(Supplier<T> target, Function<T, R> mapper) {
    return () -> mapper.apply(target.get());
}

Supplier<String> customerName = map(Customer::new, Customer::getName);