我想用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?
答案 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);
}