传递和调用方法引用的Lambda语法是什么?
场景:基于枚举中的值构建对象(单选按钮)。
我传递枚举值的集合。我希望另一个方法(构造函数)在每个枚举值上调用一个方法。该方法调用确定每个单选按钮的显示标签。
但是该方法的名称因每个特定的Enum类而异。一些枚举有一个getTitle
方法,另一个可能有一个名为get描述
或getCaption
的方法,还有一个可能有getLocalizedVariationOfTitle
。如何让每个调用程序员传递他们要调用的特定方法?
Collection<SomeEnum> enumValues = Arrays.asList( SomeEnum.values() );
x = new EnumRadioButtons( enumValues , ??methodReferenceToGetTitle?? );
传递和调用的语法??方法RecentceToGetTitle??
让我摸不着头脑。构造函数看起来像这样:
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()
。但是我得到编译器错误。
我有预感这个答案可能是使用供应商
:
public EnumRadioButtons ( Collection<?> options , java.util.function.Supplier<String> supplierOfTitle ) {
super( caption , options );
for ( Object option : options ) {
this.setTitleOfEachOption( option , supplierOfTitle.get() );
}
}
作为一种解决方法,我可以要求每个Enum实现TitleGtable
的接口,例如:
public interface TitleGetable
{
public String getTitle ();
}
但是让所有调用程序员携带并显式实现这个额外的接口似乎很愚蠢。鉴于这是一个只返回一个字符串的方法,它似乎在乞求一个简单的Lambda语法。
当您希望用户使用能够使用lambda语法时,您所要做的就是获取一个参数,该参数是一个具有一个抽象函数的接口。
调用者决定使用方法引用,一个带有
()的lambda-
为了更好的类型安全性,使用泛型可能比使用原始集合更好。
这将是一个定义。
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
}
}