gpt4 book ai didi

java - 用于传递和调用方法引用的 Lambda 语法

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:08:34 25 4
gpt4 key购买 nike

什么是传递和调用方法引用的 Lambda 语法

场景:基于 Enum 中的值构建对象(单选按钮) .

我传递了枚举值的集合。我希望其他方法(构造函数)对每个枚举值调用一个方法。该方法调用决定了每个单选按钮的显示标签。

但是该方法的名称因每个特定的 Enum 类而异。一些枚举有一个 getTitle 方法,另一个可能有一个名为 getDescriptiongetCaption 的方法,还有一个可能有 getLocalizedVariationOfTitle。我如何让每个调用程序员传递他们要调用的特定方法?

Collection<SomeEnum> enumValues = Arrays.asList( SomeEnum.values() );
x = new EnumRadioButtons( enumValues , ??methodReferenceToGetTitle?? );

传递和调用 ??methodReferenceToGetTitle?? 的语法让我难以理解。构造函数看起来像这样:

public EnumRadioButtons ( Collection<?> options , ??methodReferenceToGetTitle?? ) {

for ( Object option : options ) {
this.setTitleOfEachOption( option , ??methodReferenceToGetTitle?? );
}
}

当方法引用被取消引用时,代码实际上变成了:

this.setTitleOfEachOption( option , option.getTitle() );  // Pass the radio button item, and its label text.

或:

this.setTitleOfEachOption( option , option.getDescription() );

或:

this.setTitleOfEachOption( option , option.getSomeLocalizedVariationOfTitle() );

我尝试将 MyEnum::getTitle 传递给一个名为 MyEnum 的枚举,它确实有一个方法 getTitle()。但是我遇到了编译器错误。

我有预感这个答案可能会使用 Supplier :

public EnumRadioButtons ( Collection<?> options , java.util.function.Supplier<String> supplierOfTitle ) {
super( caption , options );
for ( Object option : options ) {
this.setTitleOfEachOption( option , supplierOfTitle.get() );
}
}

作为变通方法,我可以要求每个 Enum 实现 TitleGetable 的接口(interface),例如:

public interface TitleGetable
{
public String getTitle ();
}

但是让所有的调用程序员携带并显式实现这个额外的接口(interface)似乎很愚蠢。鉴于这是一个仅返回字符串的单一方法,它似乎在乞求一种简单的 Lambda 语法。

最佳答案

当您希望用户能够使用 lambda 语法时,您所要做的就是获取一个参数,该参数是一个具有一个抽象函数的接口(interface)。
调用者决定使用一个方法引用,一个带有
的lambda () -> 风格或像普通的 pre-java 8 接口(interface)一样实现接口(interface)。为方便起见,java.util.function 中有几个预定义的。

为了更好的类型安全,使用泛型可能比原始集合更好。

这将是一个定义。

class EnumRadioButtons<T> {

public EnumRadioButtons(Collection<T> options, Function<T,String> f ) {
for (T option : options) {
this.setTitleOfEachOption(option, f.apply(option));
}
}

public void setTitleOfEachOption(T option, String title) {
System.out.println("DEBUG - Setting title of option: " + option + " to have title of: " + title );
}
}

例如,可以将其用于此枚举:

enum MyEnum {
A,B,C;

public String myToString() {
return toString();
}
}

…和这个main方法类:

class User {
public static void main(String[] args) {

EnumRadioButtons<MyEnum> bts
= new EnumRadioButtons<>(Arrays.asList(MyEnum.values()),
MyEnum::myToString); // user of method reference
}
}

关于java - 用于传递和调用方法引用的 Lambda 语法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32216041/

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