JAVA_FILLTHEGAPS Telegram 590
Зачем нужен и чем плох Optional.stream()?

Когда ты в разработке 10+ лет, сложно чему-то удивиться. Кажется, что JDK изучен вдоль и поперек, и этот мир абсолютно понятен.

Но недавно мне встретился странный зверёк метод, и это вылилось в очередной пост серии “критикую JDK”.

Допустим, вы увидели в коде Optional.stream(). Попробуем угадать, что он делает.

Может быть, метод нужен, чтобы сделать из Optional стрим и использовать методы Stream API?

Хотя интернет предлагает нам статьи с подобными примерами, включим здравый смысл.

Зачем так усложнять код? Зачем из одного значения делать стрим?
Оставим авторов статей молча краснеть и продолжим исследование.

📚 В документации находим больше интересных деталей:

▫️ Если в Optional есть значение, метод вернёт стрим с этим значением.
▫️ Если Optional пустой, вернётся пустой стрим.

Также узнаем, что метод предназначен для работы с flatMap.

Например, некоторые пользователи указывают емейл, а некоторые нет. Если getEmail возвращает Optional, список емейлов получаем так:
List emails = users.stream().map(User::getEmail).flatMap(Optional::stream).toList();

А теперь критика. Ваша любимая часть:) Что с этим методом не так, и как можно сделать лучше?

Метод нужен, чтобы вытащить данные из набора Optional. В одну строчку это не сделать, минимум в две:
.filter(Optional::isPresent)
.map(Optional::get)

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

Почему. Такой. Ужасный. Дизайн.

👎 Метод находится в классе Optional, но бесполезен для Optional обьекта
👎 Метод заточен только под flatMap
👎 Выглядит непонятно. flatMap(Optional::stream) похож на набор слов, приходится напрячься, чтобы его понять. Сравните с очаровательными filter, map, count, findFirst🥰
👎 Сомнительная реализация. Сначала плодим маленькие стримы из каждого элемента, потом их соединяем. Столько лишних действий!

Как можно по-другому?

Я бы добавила в Stream API отдельный метод, “очищающий” текущий стрим от лишнего. Пусть он будет универсальным:

▫️ Для стрима из Optional возвращает стрим значений, empty пропускаются
▫️ Для прочих стримов убирает null элементы

Название под вопросом. Мне нравится getValues(), но можно и получше придумать.

И всё, незачем усложнять класс Optional и плодить сложные конструкции!

Простота и ясность - наше всё. Не знаю, чем думал автор метода и куда смотрели ревьюеры. Мы с вами точно бы такое не пропустили🔥



tgoop.com/java_fillthegaps/590
Create:
Last Update:

Зачем нужен и чем плох Optional.stream()?

Когда ты в разработке 10+ лет, сложно чему-то удивиться. Кажется, что JDK изучен вдоль и поперек, и этот мир абсолютно понятен.

Но недавно мне встретился странный зверёк метод, и это вылилось в очередной пост серии “критикую JDK”.

Допустим, вы увидели в коде Optional.stream(). Попробуем угадать, что он делает.

Может быть, метод нужен, чтобы сделать из Optional стрим и использовать методы Stream API?

Хотя интернет предлагает нам статьи с подобными примерами, включим здравый смысл.

Зачем так усложнять код? Зачем из одного значения делать стрим?
Оставим авторов статей молча краснеть и продолжим исследование.

📚 В документации находим больше интересных деталей:

▫️ Если в Optional есть значение, метод вернёт стрим с этим значением.
▫️ Если Optional пустой, вернётся пустой стрим.

Также узнаем, что метод предназначен для работы с flatMap.

Например, некоторые пользователи указывают емейл, а некоторые нет. Если getEmail возвращает Optional, список емейлов получаем так:

List emails = users.stream().map(User::getEmail).flatMap(Optional::stream).toList();

А теперь критика. Ваша любимая часть:) Что с этим методом не так, и как можно сделать лучше?

Метод нужен, чтобы вытащить данные из набора Optional. В одну строчку это не сделать, минимум в две:
.filter(Optional::isPresent)
.map(Optional::get)

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

Почему. Такой. Ужасный. Дизайн.

👎 Метод находится в классе Optional, но бесполезен для Optional обьекта
👎 Метод заточен только под flatMap
👎 Выглядит непонятно. flatMap(Optional::stream) похож на набор слов, приходится напрячься, чтобы его понять. Сравните с очаровательными filter, map, count, findFirst🥰
👎 Сомнительная реализация. Сначала плодим маленькие стримы из каждого элемента, потом их соединяем. Столько лишних действий!

Как можно по-другому?

Я бы добавила в Stream API отдельный метод, “очищающий” текущий стрим от лишнего. Пусть он будет универсальным:

▫️ Для стрима из Optional возвращает стрим значений, empty пропускаются
▫️ Для прочих стримов убирает null элементы

Название под вопросом. Мне нравится getValues(), но можно и получше придумать.

И всё, незачем усложнять класс Optional и плодить сложные конструкции!

Простота и ясность - наше всё. Не знаю, чем думал автор метода и куда смотрели ревьюеры. Мы с вами точно бы такое не пропустили🔥

BY Java: fill the gaps


Share with your friend now:
tgoop.com/java_fillthegaps/590

View MORE
Open in Telegram


Telegram News

Date: |

Hashtags 4How to customize a Telegram channel? Your posting frequency depends on the topic of your channel. If you have a news channel, it’s OK to publish new content every day (or even every hour). For other industries, stick with 2-3 large posts a week. A Telegram channel is used for various purposes, from sharing helpful content to implementing a business strategy. In addition, you can use your channel to build and improve your company image, boost your sales, make profits, enhance customer loyalty, and more. 3How to create a Telegram channel?
from us


Telegram Java: fill the gaps
FROM American