Почему Optional<T> не реализует поставщика<T>?
Мы все это знаем Optional<T>
есть метод T get()
так почему же не реализовать Supplier<T>
?
Если бы не было причины, почему это сломало бы какой-либо предыдущий код, если бы Oracle внедрил его в будущую версию Java?
3 ответа
Это потому, что они имеют в виду разные вещи.
Optional<T>
является аргументом, который может или не может быть предоставлен, возвращаемым значением, которое может или не может быть предоставлено, или переменной, которой может или не может быть присвоено значение. Если оно имеет значение, вы можете использовать .get()
чтобы получить это. .get()
может вызвать исключение, если вы делаете что-то не так, т. е. если вы вызываете его, когда значение отсутствует.
Supplier<T>
является функциональным объектом, который будет предоставлять значение (или ноль) по требованию. В отличие от Optional<T>
это разумно для Supplier.get()
возвращать другое значение каждый раз, когда вы вызываете его. Если Supplier.get()
выдает исключение, это означает, что что-то пошло не так в его реализации, а не то, что вызывающая сторона допустила ошибку
Как объясняет @MattTimmermans, логической причины для Optional
реализовать Supplier
, Тем не менее, ссылки на методы Java упрощают преобразование между интерфейсами с одинаковой функциональной сигнатурой. Учитывая Optional<T> o
, вы можете передать его любому методу или переменной, ожидающей Supplier<T>
в виде o::get
,
Ни один из интерфейсов в пакете java.util.function не имеет реализующих классов (по крайней мере, классов платформы Java). Я думаю, это потому, что эти интерфейсы не были предназначены для каких-либо других целей, но, как говорится в описании пакета, для обеспечения целевых типов для лямбда-выражений и ссылок на методы.