【问题标题】:How to create enum with BiConsumer<R, T> as constructor parameter如何使用 BiConsumer<R, T> 作为构造函数参数创建枚举
【发布时间】:2019-06-25 12:51:09
【问题描述】:

我想创建枚举类,将 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 value is never used

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

【问题讨论】:

  • 您的第二个 sn-p 使用调用 printString() 的 BiConsumer 创建 BI_CONSUMER。它不会调用printString() 返回的BiConsumer。
  • 也许你的意思是BI_CONSUMER(printString());
  • @SotiriosDelimanolis 是的,没错,这行得通!为什么我没有早点想出这个想法,如果它那么容易!谢谢!
  • @SotiriosDelimanolis 我鼓励你将你的评论变成一个 OP 可以接受的答案

标签: java lambda functional-programming functional-interface


【解决方案1】:

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

BI_CONSUMER(BiConsumerEnum::printString);

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

【讨论】:

  • 请解释我为什么被否决。
  • 请解释您所做的更改以及为什么需要更改。
【解决方案2】:

虽然 Sotirios Delimanolis 已经在 cmets 中提出了修复建议,但尚未详细说明您当前的代码表示:

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 没有被使用。您可能打算使用从现有方法 printString 返回的 BiConsumer&lt;Integer, String&gt; 并将其调用为:

BI_CONSUMER(printString());

【讨论】:

    猜你喜欢
    • 2021-06-28
    • 1970-01-01
    • 1970-01-01
    • 2018-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-06
    相关资源
    最近更新 更多