如何使用BiConsumer <r,t =“”>作为构造函数参数创建枚举

时间:2019-02-01 00:11:24

标签: 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 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 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);
}

代码无法正常运行,并且我得到了警告:从未使用过返回值

我应该如何从构造函数中提取方法,而不是在内部编写整个lambda?

2 个答案:

答案 0 :(得分:0)

尽管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<Integer, String>中返回的printString并将其调用为:

BI_CONSUMER(printString());

答案 1 :(得分:-1)

我相信这是最简单的格式。

BI_CONSUMER(BiConsumerEnum::printString);

private static void printString(Integer i, String s) {
    Collections.nCopies(i, s).forEach(System.out::println);
}