Проще говоря монады - это шаблон проектирования, когда есть обёртка для значений, функция оборачивания, и функция маппинга обёрнутых значений(flatMap в данном случае). Всё остальное это нюансы применения. Стримы, флаксы, опшиналы применяют этот шаблон - поэтому название у всех на слуху. Сложность обычно вызывает потому что всё сразу сваливают в одну кашу 🙂
Такой вопрос. Не совсем понятен смысл именно метода flatMap. Почему нельзя просто в методе map создать и вернуть новую монаду без дополнительного шага с созданием функции которая создаст монаду во flatMap? конкретнее, на 5:00 в 27 строке заменить return flatMap(val -> new Monad(mapFunc.apply(val))); на return new Monad(mapFunc.apply(value));
Если попытаться заинлайнить реализацию flatMap() в метод map(), то идея сначала создаёт такую конструкцию: return ((Function) val -> new Monad(mapFunc.apply(val))).apply(value); и тут же предлагает упростить до: return new Monad(mapFunc.apply(value)); т.е. эффективно это одно и то же. Т.е. на вопрос "почему нельзя" ответ - "можно". И да, получается, что в варианте с вызовом flatMap() дополнительно создаётся промежуточная лямбда. А смысл flatMap, как я понимаю, в другом типе аргумента.
5:06 flatMap понятный метод, ясно что получает параметром Function и возвращает результат работы этой Function, но с методом map, который внутри себя вызывает flatMap появляется вопрос -- что в этом случае есть val на строке 27? откуда возьмётся эта переменная?
монада с Optional похожа на Maybe из RxJava - и когда первый раз работаешь с Rx и код перестает работать, в том, смысле, что код запустился и ничего не произошло - это выносит мозг
Анекдот чуть более закрученный на самом деле Летят Холмс с Ватсоном на воздушном шаре. И спят в полете. Просыпаются над какой-то незнакомой землей, видят - внизу какой-то хрен коров пасет. Хотят узнать куда они прилетели. Снизились они и спрашивают мужика: - Скажите, сэр, где мы находимся? - На воздушном шаре. - Спасибо, сэр! - и летят вверх. Холмс задумчиво говорит: - Ватсон, мы в Росиии! - Холмс, а с чего вы взяли, что мы в России? - Это элементарно! Во-первых, он долго думал над ответом. Во-вторых, его ответ был абсолютно точен. И в третьих - абсолютно бесполезен! Значит это был програмист. А только в России программист может работать пастухом.
Кто, интересно, первый решил, что надо монадный метод называть flatMap? Flat это flattening, уплощение. Когда был список списков списков, а стал просто список. В Хаскеле есть понятие Functor, что, в общем, по сути, монада, и такая функция называется там называется fmap. 'F' от Functor, а не от flat. Здесь, подозреваю, кто-то что-то однажды неправильно услышал, понял, додумал, а теперь все повторяют.
@@sjavaoradev ну конечно. В функциональном программировании, к которому относятся монады, вообще все переменные считаются иммутабельными. Поменять значение переменной нельзя, можно только создать новую.
Спасибо за видео. Интересно было посмотреть, как можно сделать это в Java самому. Но... Монады - эндофункторы! А не "интерфункторы" )) Приставка "эндо" как раз и говорит о направленности внутрь себя.
@@eternalgreed6715 Фундаментальнее - это надо в теорию категорий смотреть. Еще можно попробовать писать на Хаскеле, там без монад никуда, так как все иммутабельное. У меня около-математическое образование. Специальность - системы автоматики - это как раз на стыке техники, математики и программирования. По этому я из тех, кто знает всего понемногу)
"Моноид в категории интерфункторов" - сделайте видео с более глубоким погружением в математику, пожалуйста. Это теория полей? Какие книги по математике для программиста Вы бы посоветовали? Практичные книги по математике для программистов, непрактичные и понятные, непрактичные и интересные с уклоном в математику? Спасибо за урок!
Спасибо за отличное объеснение! Хотелось бы еще больше видео на эту тему
Самое понятное объяснение монад, так держать!)
Офигеть! Очень надеюсь дойти до такого уровня, чтобы писать подобные штуки. Спасибо огромное!
Отличный контент! Спасибо! Повседневно использую Optional, но не думал о нём как о монаде.
Проще говоря монады - это шаблон проектирования, когда есть обёртка для значений, функция оборачивания, и функция маппинга обёрнутых значений(flatMap в данном случае). Всё остальное это нюансы применения. Стримы, флаксы, опшиналы применяют этот шаблон - поэтому название у всех на слуху. Сложность обычно вызывает потому что всё сразу сваливают в одну кашу 🙂
дай тебе бог здоровья
Очень интересно, как вам идея сделать видео про асинхронное программирование в Java?
Давно собираюсь, но все не могу придумать подходящий пример, на котором можно все доходчиво показать.
@@arhitutorials так придумывать может не нужно, просто взять пример готовый и разобрать :)
Спасибо! Норм объяснил, многое стало на место. Снимай исчо!
Вау, спасибо. Прям на пальцах все разложено. Эх, хотелось бы погрузиться в теорию, но куча отговорок мешает)
Очень круто , спасибо
Спасибо за полезный урок! Для переименования нескольких переменных попробуй shift + F6
17:21 содержимое flatMapSingle (contacts -> SalonsService.getApiImpl().getMeCustomer(getSessionKey()))/ andThen(Single.defer(() -> {...}))
Спасибо за видео 🙌🏻
Вот теперь стало понятнее, что билдер и монада не одно и то же )
Такой вопрос. Не совсем понятен смысл именно метода flatMap. Почему нельзя просто в методе map создать и вернуть новую монаду без дополнительного шага с созданием функции которая создаст монаду во flatMap?
конкретнее, на 5:00 в 27 строке заменить
return flatMap(val -> new Monad(mapFunc.apply(val)));
на
return new Monad(mapFunc.apply(value));
Если попытаться заинлайнить реализацию flatMap() в метод map(), то идея сначала создаёт такую конструкцию:
return ((Function) val -> new Monad(mapFunc.apply(val))).apply(value);
и тут же предлагает упростить до:
return new Monad(mapFunc.apply(value));
т.е. эффективно это одно и то же. Т.е. на вопрос "почему нельзя" ответ - "можно". И да, получается, что в варианте с вызовом flatMap() дополнительно создаётся промежуточная лямбда.
А смысл flatMap, как я понимаю, в другом типе аргумента.
5:06 flatMap понятный метод, ясно что получает параметром Function и возвращает результат работы этой Function, но с методом map, который внутри себя вызывает flatMap появляется вопрос -- что в этом случае есть val на строке 27? откуда возьмётся эта переменная?
Здравствуйте. Строка 27 это реализация тела метода apply из строки 23. А в строке 23 в вызываемый метод передается поле value конкретного экземпляра.
монада с Optional похожа на Maybe из RxJava - и когда первый раз работаешь с Rx и код перестает работать, в том, смысле, что код запустился и ничего не произошло - это выносит мозг
Спасибо!!!
Анекдот чуть более закрученный на самом деле
Летят Холмс с Ватсоном на воздушном шаре. И спят в полете. Просыпаются
над какой-то незнакомой землей, видят - внизу какой-то хрен коров пасет. Хотят узнать куда они прилетели.
Снизились они и спрашивают мужика:
- Скажите, сэр, где мы находимся?
- На воздушном шаре.
- Спасибо, сэр! - и летят вверх. Холмс задумчиво говорит:
- Ватсон, мы в Росиии!
- Холмс, а с чего вы взяли, что мы в России?
- Это элементарно! Во-первых, он долго думал над ответом. Во-вторых, его
ответ был абсолютно точен. И в третьих - абсолютно бесполезен!
Значит это был програмист. А только в России программист может работать пастухом.
100 лайков этому джентльмену
Услышал про монады сразу подумал про Haskell.
Кто, интересно, первый решил, что надо монадный метод называть flatMap? Flat это flattening, уплощение. Когда был список списков списков, а стал просто список.
В Хаскеле есть понятие Functor, что, в общем, по сути, монада, и такая функция называется там называется fmap. 'F' от Functor, а не от flat.
Здесь, подозреваю, кто-то что-то однажды неправильно услышал, понял, додумал, а теперь все повторяют.
👍👍👍 спасибо
получается каждый раз когда мы вызваем map - мы возращаем новый инстанс Monad ?
Да.
а это правильно ? @@arhitutorials
@@sjavaoradev ну конечно. В функциональном программировании, к которому относятся монады, вообще все переменные считаются иммутабельными. Поменять значение переменной нельзя, можно только создать новую.
а, ок забыл что монад должен быть обязательно Immutable . Спасибо !@@arhitutorials
А если в Lazy я хочу также и Option, есть какое-то объединение монад? Т.е. пример не совсем практический.
После просмотра твоего видоса про генерацию шума хочется спросить: а эти облака на конечной заставке - настоящие? )
Что только джависты не придумают, что бы Котлином не пользоваться! :)
так котлин на джаве написан, смысл этой прослойки?
😂😂😂😂
@@edwardfreedom Залет на собесе за такой ответ, Николай.
@@edwardfreedom а java на С написан.
@@dddsss12345 а с на асэмблере
Хотел бы увидеть обзор на плагин Advanced Custom Fields
Я так понимаю это собственно то, на чем основан Stream API?
Спасибо за видео. Интересно было посмотреть, как можно сделать это в Java самому.
Но... Монады - эндофункторы! А не "интерфункторы" )) Приставка "эндо" как раз и говорит о направленности внутрь себя.
А как поглубже и пофундаментальнее изучить монады?
Интересно было бы послушать более научное объяснение. И ещё вопрос у вас математическое образование?)
@@eternalgreed6715 Фундаментальнее - это надо в теорию категорий смотреть. Еще можно попробовать писать на Хаскеле, там без монад никуда, так как все иммутабельное.
У меня около-математическое образование. Специальность - системы автоматики - это как раз на стыке техники, математики и программирования. По этому я из тех, кто знает всего понемногу)
@@arhitutorials круто, спасибо большое. А какой вуз ?
Сейчас этот вуз называется СевГУ
Как углубиться в функциональщину, чтоб лучше понмать написаные вами функции flatmap и map?
У меня больше аналитическое мышление чем абстрактное
Только не пойму, в чем преимущество, в этом способе лейзи, перед тем если мы просто напишем саплайер?
"Моноид в категории интерфункторов" - сделайте видео с более глубоким погружением в математику, пожалуйста. Это теория полей? Какие книги по математике для программиста Вы бы посоветовали? Практичные книги по математике для программистов, непрактичные и понятные, непрактичные и интересные с уклоном в математику? Спасибо за урок!
Теория категорий в математике
полезно. лайк
чат в тг не находит
@@dmaberlin t.me/+TH9AoBq_ct6RYZgz
Гораздо больше напоминает не билддера а цепочку (chain of responsibility)
скорее декоратор
Cпасибо за хорошую ,легкую подачу. Хочется про JavaFx(еще актуальна?) и lambok maven(gradle)
Не ленюсь даже комментарий оставить.
Константы именуются в стиле CONSTANT_CASE. За все остальное - спасибо! )
так Optional это и есть Monad? зачем создавать отдельный?