В чем разница между Collections.emptyList () и Collections :: emptyList - PullRequest
0 голосов
/ 13 февраля 2020

При использовании java ошибка потокового отображения при кодировании

Optional.ofNullable(product.getStudents())
                .orElseGet(Collections.emptyList())
                .stream().map(x->x.getId)
                .collect(Collectors.toList());

этот код показывает ниже ошибку ОШИБКА

несовместимый тип, Требуется поставщик> но пустой список был добавлен в List: экземпляра переменной типа T не существует, поэтому List соответствует поставщику>

Но если я заменим Collections.emptyList() WITH Collections::emptyList, то все будет идеально.

В чем разница между Collections.emptyList () и Collections :: emptyList?

Ответы [ 2 ]

8 голосов
/ 13 февраля 2020

Collections.emptyList() - это метод static, который возвращает List<T>, то есть выражение Collections.emptyList() будет выполнять метод emptyList(), а его значение будет List<T>. Поэтому вы можете передать это выражение только методам, для которых требуется аргумент List.

Collections::emptyList - это ссылка на метод, который может реализовать функциональный интерфейс, у которого единственный метод имеет совпадающую сигнатуру.

A Supplier<List<T>> - это функциональный интерфейс, имеющий единственный метод, который возвращает List<T>, который соответствует сигнатуре Collections.emptyList(). Следовательно, метод - такой как Optional orElseGet(Supplier<? extends T> other) - для которого в вашем примере требуется Supplier<? extends List<Student>> - может принять ссылку на метод Collections::emptyList, которая может реализовать этот интерфейс.

1 голос
/ 13 февраля 2020

:: оператор является сокращением для лямбда-выражения, вызывающего определенный c метод - по имени. Это, конечно, еще более читаемый синтаксис.

Он также может использоваться с stati c метода экземпляра.

для stati c: Collections :: emptyList

например: System.out :: print

...