如何使用 BiConsumer<R, T> 作为构造函数参数创建枚举

How to create enum with BiConsumer<R, T> as constructor parameter

我想创建枚举 class,并将 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);
}

代码未 运行 正确,我收到警告:return 值从未使用过

我应该如何从构造函数中提取方法,而不是将整个 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?
    }
});

并注意上面的 return 类型的 printString 没有被使用。您可能打算使用现有方法 printString 中的 returned BiConsumer<Integer, String> 并将其调用为:

BI_CONSUMER(printString());