如何使用 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());
我想创建枚举 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());