gpt4 book ai didi

lambda - 为什么可以传递方法引用而不是转换器实例?

转载 作者:行者123 更新时间:2023-12-02 09:48:16 25 4
gpt4 key购买 nike

我对 Java 8 中 method::lambdas 的解析类型有疑问。

给出这个示例方法,它使用给定的 spring-core Converter 实现转换对象列表:

public static <S, T> List<T> convertToList(Collection<? extends S> input, Converter<S, T> converter) {
List<T> results = new ArrayList<>(input != null ? input.size() : 0);
if (input != null && !input.isEmpty()) {
for (S element : input) {
results.add(converter.convert(element));
}
}

return results;
}

然后说我有一个特定的实现,BoatConverter:

public class BoatConverter implements Converter<Boat, BoatConverted> {

@Override
public BoatConverted convert(Boat boat) {
// ...
}

}

调用此方法的一种方法是:

ConversionHelper.convertToList(response.getBoats(), boatConverter)

但是,我注意到 Java 编译器(和预期结果)对此同样满意:

ConversionHelper.convertToList(response.getBoats(), boatConverter::convert)

在这种情况下,鉴于convert()返回一个BoatConverted,但convertToList()需要一个Converter类型,我的问题是编译器如何解决这个明显的冲突,特别是因为你传入了convert()的lambda但convertToList( ) 实用程序方法想要在传入的预期转换器对象上调用该方法?

最佳答案

Converter 实际上是一个函数式接口(interface),因为它只包含一个抽象方法:

package org.springframework.core.convert.converter;

public interface Converter<S, T> {
T convert(S var1);
}

这意味着它可以用作 lambda 表达式的目标,并且您的示例可以重写为:

c -> boatConverter.convert(c)

在这种情况下,您的 lambda 只是将作业委托(delegate)给已经存在的 Converter 实例,并且由于方法签名与接口(interface)方法匹配,因此可以将其替换为方法引用。

主要区别在于,当您传递 boatConverter 时,您只是将此实例重用为 Converter 但如果您编写 boatConverter::convertc ->boatConverter.convert(c)
您正在创建一个新的 Converter 实例,该实例将转换委托(delegate)给 boatConverter

关于lambda - 为什么可以传递方法引用而不是转换器实例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45874771/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com