1

还有另一个问题只解释了传递函数引用,但这并没有回答下面关于这个 Java 赋值如何工作、转换到这个Supplier对象以及何时发生的问题。

我有以下代码片段并且有点难以理解它,可能我不是唯一一个。有人可以给出这个代码的“傻瓜”解释(供应商模式和使用双冒号(::)运算符的赋值。Java 什么时候真正进行函数调用?我的期望是它objectFactorySupplier变成一个函数指针。

private Supplier<ObjectFactory> getObjectFactorySupplier(String name) {
    // how does this assignment work?
    Supplier<ObjectFactory> objectFactorySupplier = this::getObjectFactory;
    ...
    return objectFactorySupplier;
}

private ObjectFactory getObjectFactory() {
    ObjectFactory factory = new ObjectFactorySupplier().get();
    ...
    return factory;
}
4

3 回答 3

2
  • Supplier是作为 Java 8 的一部分引入的功能接口。因此,可以在 lambda 表达式中替换功能接口,例如:Runnable、Callable 等。因此,根据定义,它代表结果的提供者。
  • ::是一个方法引用

在您的代码中,

Supplier<ObjectFactory> objectFactorySupplier = this::getObjectFactory;

this::getObjectFactory返回对您的私有方法的方法引用。并且此方法引用被分配到表达式的左侧。根据它的代码定义,它基本上提供了一个 objectFactory。可以赋值是因为它符合Supplier功能接口的定义

现在,这个方法引用最终用于获取objectFactory。

于 2020-05-01T08:28:24.223 回答
1

该声明

Supplier<ObjectFactory> objectFactorySupplier = this::getObjectFactory;

b 也可以用 lambda 表示为

Supplier<ObjectFactory> objectFactorySupplier = () -> getObjectFactory();

这很容易阅读,无需任何输入即可提供getObjectFactory方法调用的返回类型。

它返回什么?一个ObjectFactory!因此很容易被推断为并分配给Supplier<ObjectFactory>变量。

于 2020-05-01T08:28:02.050 回答
0

什么是Supplier界面?

它是一个功能接口。您可以在 java 中声明一个 lambda 并使用函数式接口作为其目标。它还提供了一个抽象方法get(),也称为函数方法。get()用于获取Supplier调用时返回的结果。

因此,您可以声明一个供应商,调用它并使用get.

一个例子

一个非常简单的示例来了解如何创建供应商然后使用它。在这里,我为我的 Rectangle 创建了一个供应商,每当调用供应商时,它将返回一个宽度和高度的新矩形。

public class Main
{
    // A simple class
    public static class Rectangle
    {
        int width, height;
        public Rectangle(int w, int h) {
            width = w; height = h;
        }       
        @Override
        public String toString() {
            return String.format("width=%s height=%s", width, height);
        }
    }

    public static void main(String[] args) {
        // How to create a supplier?
        Supplier<Rectangle> rectSupp = new Supplier<Rectangle>() {
            /**
             * Important to implement this functional method
             */
            @Override
            public Rectangle get() {
                return new Rectangle(1, 2);
            }
        };

        // How to create a lambda supplier?
        Supplier<Rectangle> lambdaRectSupp = () -> new Rectangle(3, 4);

        System.err.println(rectSupp.get());
        System.err.println(lambdaRectSupp.get());
    }
}
于 2020-05-01T08:47:22.807 回答