Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/356.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/amazon-web-services/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使用双消费者创建枚举<;R、 T>;作为构造函数参数_Java_Lambda_Functional Programming_Functional Interface - Fatal编程技术网

Java 如何使用双消费者创建枚举<;R、 T>;作为构造函数参数

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

我想创建枚举类,使用BiConsumer作为构造函数参数。如果我这样做的话,一切正常

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());