Вы можете попробовать этот код. Может быть полезно.

от вопрос уже есть ответ здесь:

Почему ссылка на метод Java с типом возврата соответствует интерфейсу потребителя? 2 ответа

Интерфейс Consumer для лямбда типаT -> void, но в следующем коде:

ЛямбдаBook::getName принимает тип:Book->StringЯ хотел бы спросить, почему он может выступать в качестве потребителя (аргумент List.forEach является потребителем).

class Book {
    private String name;

    public Book(String name) {
        this.name = name;
    }

    public String getName() {
        System.out.println(name);
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}
public class BookTest {
    @Test
    public void testBook() {
        List<Book> books  = new ArrayList<>();
        books.add(new Book("A"));
        books.add(new Book("D"));
        books.add(new Book("C"));
        books.add(new Book("B"));

        Function<Book, String> function = Book::getName;
        books.forEach(Book::getName);

        //error here
        //books.forEach(function);

    }
}

Ответы на вопрос(2)

Решение Вопроса

будет адаптирован просто отбрасывая возвращаемое значение.

 Thilo24 окт. 2017 г., 13:33
В Scala вы также можете использовать блок, который возвращает что-то, когдаUnit (то есть "void") требуется.
 Enrico Giurin24 окт. 2017 г., 13:53
Я хотел бы понять, почему это так. Например, getName () возвращает строку, поэтому я не могу написать что-то вроде этого: Consumer <Book> c = (Book b) -> "", но я могу написать Consumer <Book> consumer = Book :: getName;
 Tom24 окт. 2017 г., 13:31
Спасибо @thilo. Я запутался со Scala, который использует последнюю строку кода в качестве значения функции / методов / и т. Д.
 Holger24 окт. 2017 г., 15:28
@EnricoGiurin: для лямбда-выраженийarg -> expression форма, см«Лямбда 'специальное правило void-совместимости' - выражение оператора» или жеэтот ответ, Для вызовов метода самый простой ответ заключается в том, что вы всегда можете вызвать метод и игнорировать возвращаемое значение. Но вы не можете написать заявление, как"";
 Tom24 окт. 2017 г., 13:54
Я пытался .... и ты прав. Спасибо!
public static void main(String[] args) {
    List<Book> books  = new ArrayList<>();
    books.add(new Book("A"));
    books.add(new Book("D"));
    books.add(new Book("C"));
    books.add(new Book("B"));

    Function<Book, String> function = Book::getName;
    Consumer<Book> consumerFunction = Book::getName;
    books.forEach(Book::getName);

    books.forEach(consumerFunction);

}

Ваш ответ на вопрос