是什么用于传递和调用方法引用的 Lambda 语法?
场景:根据值构建对象(单选按钮)Enum http://docs.oracle.com/javase/tutorial/java/javaOO/enum.html.
我传递了枚举值的集合。我希望另一个方法(构造函数)对每个枚举值调用一个方法。该方法调用确定每个单选按钮显示的标签。
但该方法的名称因每个特定的 Enum 类而异。一些枚举有一个getTitle
方法,另一个可能有一个名为getDescription
or getCaption
,还有一个可能有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.
or:
this.setTitleOfEachOption( option , option.getDescription() );
or:
this.setTitleOfEachOption( option , option.getSomeLocalizedVariationOfTitle() );
我尝试通过MyEnum::getTitle
对于一个名为MyEnum
确实有一个方法getTitle()
。但我收到编译器错误。
我有预感这个答案可能会使用Supplier http://docs.oracle.com/javase/8/docs/api/java/util/function/Supplier.html:
public EnumRadioButtons ( Collection<?> options , java.util.function.Supplier<String> supplierOfTitle ) {
super( caption , options );
for ( Object option : options ) {
this.setTitleOfEachOption( option , supplierOfTitle.get() );
}
}
作为解决方法,我可以要求每个枚举实现一个接口TitleGetable
例如:
public interface TitleGetable
{
public String getTitle ();
}
但是让所有调用程序员都携带并显式实现这个额外的接口似乎很愚蠢。鉴于这是一个仅返回字符串的方法,看起来它需要一个简单的 Lambda 语法。