首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java 8方法参考

Java 8方法参考
EN

Stack Overflow用户
提问于 2017-04-03 22:01:23
回答 3查看 2.2K关注 0票数 2

在Java 8中,可以在一行中调用2种引用方法吗?

代码语言:javascript
复制
customer::new::getName

可以连在一起的两个方法引用的表单:

代码语言:javascript
复制
a::b::c
EN

回答 3

Stack Overflow用户

发布于 2017-04-04 08:26:08

如何内联两个方法引用表达式?

让我们分解Customer::new::getName表达式;

代码语言:javascript
复制
T1 customer = Customer::new;
T2 name = customer::getName; 

根据JLS描述的方法引用表达式,T1T2必须是FunctionalInterface

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

当您将Supplier<Customer>T1一起使用时,编译器会报告错误:无法解决在供应商上定义的方法getName。但是您可以定义自己的FunctionalInterface,例如:CustomerSupplier

代码语言:javascript
复制
interface CustomerSupplier {
    Customer get();

    default String getName() {
        return get().getName();
    }
}

然后,您可以将Customer::new引用到CustomerSupplier

代码语言:javascript
复制
CustomerSupplier customer = Customer::new;
Supplier<String> name = customer::getName;

实际上,您可以进一步将两个表达式内联在一起,但是每个方法引用表达式都必须是一个FunctionalInterface,因此必须将Customer::new转换为CustomerSupplier

代码语言:javascript
复制
Supplier<String> customerName = ((CustomerSupplier) Customer::new)::getName;

不过是,最简单的方法是直接访问@Holger提供的访问。

代码语言:javascript
复制
Supplier<String> customerName = () -> new Customer().getName();

如何链接两种方法引用表达式?

由于Supplier没有合成FunctionInterface的方法,但是您可以将方法引用表达式链接到如下所示:

代码语言:javascript
复制
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提供的函数接口类型。

代码语言:javascript
复制
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);
票数 3
EN

Stack Overflow用户

发布于 2017-04-03 22:05:01

不,你不能链接两个方法引用。

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

票数 1
EN

Stack Overflow用户

发布于 2017-04-03 22:05:58

在Java 8中,可以在一行中调用2种引用方法吗?

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

语法

代码语言:javascript
复制
Object::methodName
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43195051

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档