Как создать enum с помощью BiConsumerкак параметр конструктора - PullRequest
0 голосов
/ 01 февраля 2019

Я хотел бы создать класс enum с 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);
}

Код не работает должным образом, и я получил предупреждение: возвращаемое значение никогда не используется

Как извлечь метод из конструктора, вместо того, чтобы писать целую лямбду внутри?

Ответы [ 2 ]

0 голосов
/ 01 февраля 2019

Несмотря на то, что исправление было предложено 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());
0 голосов
/ 01 февраля 2019

Я считаю, что это самый простой формат.

BI_CONSUMER(BiConsumerEnum::printString);

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