在Java 8中,可以在一行中调用2种引用方法吗?
customer::new::getName可以连在一起的两个方法引用的表单:
a::b::c发布于 2017-04-04 08:26:08
如何内联两个方法引用表达式?
让我们分解Customer::new::getName表达式;
T1 customer = Customer::new;
T2 name = customer::getName; 根据JLS描述的方法引用表达式,T1和T2必须是FunctionalInterface。
如果T是函数接口类型(§9.8),则方法引用表达式在赋值上下文、调用上下文或转换上下文中与目标类型T兼容(§9.8),且表达式与从T派生的地面目标类型的函数类型一致。
当您将Supplier<Customer>与T1一起使用时,编译器会报告错误:无法解决在供应商上定义的方法getName。但是您可以定义自己的FunctionalInterface,例如:CustomerSupplier。
interface CustomerSupplier {
Customer get();
default String getName() {
return get().getName();
}
}然后,您可以将Customer::new引用到CustomerSupplier
CustomerSupplier customer = Customer::new;
Supplier<String> name = customer::getName;实际上,您可以进一步将两个表达式内联在一起,但是每个方法引用表达式都必须是一个FunctionalInterface,因此必须将Customer::new转换为CustomerSupplier。
Supplier<String> customerName = ((CustomerSupplier) Customer::new)::getName;不过是,最简单的方法是直接访问@Holger提供的访问。
Supplier<String> customerName = () -> new Customer().getName();如何链接两种方法引用表达式?
由于Supplier没有合成FunctionInterface的方法,但是您可以将方法引用表达式链接到如下所示:
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);--但是--您可以引入一种方法来避免引入@Holger提供的函数接口类型。
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);发布于 2017-04-03 22:05:01
不,你不能链接两个方法引用。
基本上,方法引用是一种语法糖,它允许您将现有方法的定义传递给Lambda表达式(实现单个abstract方法)。
发布于 2017-04-03 22:05:58
在Java 8中,可以在一行中调用2种引用方法吗?
不,在使用方法引用时不可能链接方法,因为方法引用本质上是只执行ONE方法的lambda表达式的简写语法。因此,一旦开始链接方法,它就不再是方法引用的有效语法。
语法
Object::methodNamehttps://stackoverflow.com/questions/43195051
复制相似问题