你能帮我理解这个供应商和这个Java结构中的任务吗



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

我有下面的代码片段,很难理解它,可能我不是唯一一个。有人能给这个代码一个"for dummies"的解释吗(供应商模式和使用双冒号(::(运算符的赋值(。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;
}
  • 供应商是作为Java 8的一部分引入的功能接口。因此,函数接口可以在lambda表达式中被替换,例如:Runnable、Callable等。因此,根据定义,它表示结果的提供者
  • ::是方法引用

在您的代码中,

Supplier<ObjectFactory> objectFactorySupplier = this::getObjectFactory;

this::getObjectFactory返回对私有方法的方法引用。这个方法引用被指定给表达式的左手边。根据其代码定义,它基本上提供了一个objectFactory。它可以被分配,因为它符合供应商功能接口的定义

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

语句

Supplier<ObjectFactory> objectFactorySupplier = this::getObjectFactory;

也可以用λ表示为

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

在没有任何输入的情况下提供getObjectFactory方法调用的返回类型

它会返回什么?ObjectFactory!因此,很容易推断为Supplier<ObjectFactory>变量并将其赋值。

什么是Supplier接口

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

因此,您可以声明一个供应商,调用它并使用get获取结果。

示例

一个非常简单的例子来理解如何创建供应商并使用它。在这里,我为我的矩形创建了一个供应商,每当调用供应商时,它都会返回一个宽度和高度都相同的矩形。

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());
}
}

最新更新