Java 如何使用双消费者创建枚举<;R、 T>;作为构造函数参数
我想创建枚举类,使用BiConsumer作为构造函数参数。如果我这样做的话,一切正常Java 如何使用双消费者创建枚举<;R、 T>;作为构造函数参数,java,lambda,functional-programming,functional-interface,Java,Lambda,Functional Programming,Functional Interface,我想创建枚举类,使用BiConsumer作为构造函数参数。如果我这样做的话,一切正常 public enum BiConsumerEnum { BI_CONSUMER(((Integer i, String s) -> Collections.nCopies(i, s).forEach(System.out::println))); private BiConsumer<Integer, String> biConsumer; public sta
public enum BiConsumerEnum {
BI_CONSUMER(((Integer i, String s) -> Collections.nCopies(i, s).forEach(System.out::println)));
private BiConsumer<Integer, String> biConsumer;
public static void main(String[] args) {
BiConsumerEnum.BI_CONSUMER.accept(3, "X");
}
BiConsumerEnum(BiConsumer<Integer, String> biConsumer) {
this.biConsumer = biConsumer;
}
public void accept(Integer i, String s) {
this.biConsumer.accept(i, s);
}
}
public enum biconsumereum{
BIU使用者(((整数i,字符串s)->Collections.nCopies(i,s.forEach(System.out::println));
私人双消费者双消费者;
公共静态void main(字符串[]args){
双消费者。双消费者。接受(3,“X”);
}
双消费者(双消费者双消费者){
this.biConsumer=biConsumer;
}
公共void接受(整数i,字符串s){
本.双消费者.接受(i,s);
}
}
但如果将代码更改为:
public enum BiConsumerEnum {
BI_CONSUMER((Integer i, String s) -> printString());
// main(), constructor and accept()
private static BiConsumer<Integer, String> printString() {
return (Integer i, String s) -> Collections.nCopies(i, s).forEach(System.out::println);
}
public enum biconsumereum{
BI_消费者((整数i,字符串s)->printString());
//main()、构造函数和accept()
私有静态双消费者printString(){
return(整数i,字符串s)->Collections.nCopies(i,s).forEach(System.out::println);
}
代码运行不正常,我得到了警告:从未使用返回值
我应该如何从构造函数中提取方法,而不是在其中编写整个lambda?我认为这是最简单的格式
BI_CONSUMER(BiConsumerEnum::printString);
private static void printString(Integer i, String s) {
Collections.nCopies(i, s).forEach(System.out::println);
}
尽管Sotirios Delimanolis已经在评论中提出了修复方案,但仍需进一步阐述您当前的代码表示:
BI_CONSUMER((Integer i, String s) -> printString());
将成功编译,因为您已经定义了一个新的BiConsumer
,这样您的代码的实际定义现在是:
BI_CONSUMER(new BiConsumer<Integer, String>() {
@Override
public void accept(Integer i, String s) {
printString(); // has a return value, but is it used?
}
});
您的第二个代码段使用调用
printString()
的BiConsumer
创建了BiConsumer
。它不调用printString()
返回的BiConsumer
。也许您的意思是BiConsumer(printString())
@SotiriosDelimanolis是的,确实有效!如果这么简单的话,为什么我没有早些提出这个想法!谢谢!@SotiriosDelimanolis我鼓励你将你的评论转化为一个答案,这篇评论可以解释为什么我被否决。请添加一个关于你改变了什么以及为什么有必要这样做的解释。
BI_CONSUMER(printString());