Как передать Потребитель <String>в метод - PullRequest
0 голосов
/ 08 февраля 2019

поэтому у меня есть такой код:

public ConsumerTestClass(Consumer<String> consumer) {

}

public static void printString(String text) {
    System.out.println(text);

}

И из метода другого класса я хотел бы создать объект ConsumerTestClass:

new ConsumerTestClass(/*passing consumer here*/);

И какпотребитель, которого я хотел бы передать ConsumerTestClass::printString, но чтобы это сделать, мне также нужно передать аргумент, так что это выглядит так: (text) -> ConsumerTestClass.printString(text).И мой вопрос ... Это единственный способ передать Consumer или метод, который принимает один аргумент и не возвращает результатов?

Ответы [ 2 ]

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

Ссылка на метод ConsumerTestClass::printString является просто синтаксическим сахаром для эквивалентного лямбда-выражения text -> ConsumerTestClass.printString(text)

Ссылка на метод не может использоваться ни для одного метода.Они могут использоваться только для замены лямбда-выражения с одним методом.В общем, нам не нужно передавать параметры в ссылки на методы.В этом случае параметры, взятые методом printString, автоматически передаются за сцену.

ссылки на метод обеспечивают способ генерировать функциональные объекты даже более краткие, чем лямбды.

Так что предпочитайте ссылки на методык лямбдам как к хорошей практике.

Вот полностью рабочий пример.

public class ConsumerTestClass {
    public ConsumerTestClass(Consumer<String> consumer) {
        consumer.accept("Test");
    }

    public static void printString(String text) {
        System.out.println(text);

    }

    public static void main(String[] args) {
        new ConsumerTestClass(ConsumerTestClass::printString);
    }
}

Суть в том, что вы должны передать аргумент при вызове метода acceptConsumer как сделано внутри конструктора выше.

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

Вы можете передать его как:

new ConsumerTestClass(ConsumerTestClass::printString);

, который является ссылкой на метод для

new ConsumerTestClass(x -> ConsumerTestClass.printString(x));

Это только опция для передачи Consumer или метод, который принимает одинаргумент и не возвращая результатов?

Это зависит от вашего варианта использования, например, если вы хотите передать два аргумента и по-прежнему ничего не возвращать из них, вы можете заглянуть в BiConsumer* также класс 1013 *.

Примечание : особый случай, когда вы не хотите выполнять какие-либо операции с поставляемым Consumer, выМожно выбрать, чтобы определить его как лямбда без операции, как в:

new ConsumerTestClass(s -> {});
...