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

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

场景:根据枚举中的值构建对象(单选按钮)。

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

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

 Collection 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 supplierOfTitle ) { super( caption , options ); for ( Object option : options ) { this.setTitleOfEachOption( option , supplierOfTitle.get() ); } } 

作为一种解决方法,我可以要求每个Enum实现TitleGetable的接口,例如:

 public interface TitleGetable { public String getTitle (); } 

但让所有调用程序员携带并明确实现这个额外的接口似乎很愚蠢。 鉴于这是一个只返回一个String的方法,似乎它正在寻求一个简单的Lambda语法。

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

为了更好的类型安全,使用generics而不是原始集合可能更好。

这将是一个定义。

 class EnumRadioButtons { public EnumRadioButtons(Collection options, Function 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 bts = new EnumRadioButtons<>(Arrays.asList(MyEnum.values()), MyEnum::myToString); // user of method reference } }