Функции высшего порядка в Kotlin: map, flatMap, fold, filter - понятный компактный код
Vložit
- čas přidán 4. 10. 2020
- Сегодня мы будем изучать функции высшего порядка (High-order functions): map, flatMap, filter, fold - что они делают и как их использовать.
С вами Илья Никсан и мы учим язык программирования Kotlin с нуля для начинающих программистов
Если ты хочешь быстро научиться писать код на языке котлин то смело подписывайся и следи на новыми видео на канале
Про меня:
Меня зовут Илья, мне стукнуло 30 лет
С 20 лет я плотно занимаюсь программированием и всем что связано с айти. В 2010 году я начинал карьеру как Android разработчик в QIWI. За прошедшие 10 лет я побывал во многих ролях: от джуниор-программиста, был тимлидом, менеджером, техническим директором. Успел поработать на фрилансе, в студии разработки и даже в Яндексе.
В ролике используется видео с презентации Google I/O 2017: • Developer Keynote (Goo...
Ссылки:
nixan.org/
/ nixan
/ nixan
Очень крутая картинка, сануд аааа просто кайф для глаз и ушей. Конечно же спасибо за инфу!
Контент огонь, а за саунд - отдельный респект 👍
Красавчик! Спасибо за видео!
Как же ты харош!
Класс. Отличное объяснение, вовремя убирается саунд на подложке. Отличный видимый шрифт в коде. Единственный момент, при использовании функции fold (7:20), есть переменные acc, i
Мне кажется, что вместо i лучше использовать it. i это всё таки индекс элемента в массиве, а it - значение.
Музыка божественна
Спасибо за видео!
После просмотра остался вопрос, чем *fold()* отличается от *reduce()* .
*fold()* - это и есть *reduce()* , но он принимает на вход initial значение для acc.
На примере из видео:
array = arrayOf(1, 2, 3, 4, 5, 0, -100, 1024, -100)
array.fold(Int.MIN_VALUE) { acc, i -> max(acc, i) }
На первой итерации acc == int.MIN_VALUE, i == array[0] == 1
array.reduce { acc, i -> max(acc, i) }
На первой итерации acc == array[0] == 1, i == array[1] == 2
Если array будет пустым, то *fold()* вернёт массив из initial-значения, а *reduce()* выбросит *"java.lang.UnsupportedOperationException"*
З.Ы.: концовки видео с питанием компа крутые
ЕЕеее :) Каеф :)
Поздравляю с первой сотней подписчиков :)
Данке шон, спасибо :)
Спасибо!
Лучший!
Объясни пожалуйста когда пишешь код что к чему
Круто! Просто и понятно. Большое спасибо!
Желаю успехов в развитии канала!
На RU зоне каналы по программированию раскрутить очень сложно. Но ведь кто то должен популяризировать программинг в России...
Спасибо. Я хочу проверить будет ли канал развиваться на одной лишь органике, без раскруток
Лолька. Первый варик, в цикле if == array.length - 1. Если большой текст надо обработать - это так-то плохо. Лучше было - забить на последнее слово и после этого цикла добавить цикл с конца до первого пробела || . || ,. Ясно, что второй варик чаще используют, но все-таки мне бросился этот if в глаза. Хотя да, цель была не в этом - да. Так даже чуть больше кода и еще сложнее читать, ахахах. Но тем не менее, не сочтите за критику;-)
Здравствуйте! Отличное видео! Подскажите пожалуйста как будет выглядеть код с помощью map чтобы поменять букву в слове?
map применяется ко всем элементам
если нужно поменять одну букву то можно без map обойтись
А почему в первом случае нельзя было использовать хотя-бы split?
На 9:38 какой кнопкой превратил >= в односимвольный аналог?
@@andrey7530 Тоесть в файлике это 2 символа, просто рендерится как 1?
Блин, про flatMap примеров бы побольше... но все равно лайк!
Mann was du uns bringst bei für neue menschen dei lernen, Kotlin sehr schwerige , eventuell du konteste tiefer erklaren , welche function für was verantwirtlich?
Грацули с соточкой:)
Спс!
а как нарисовать стрелочку, которую он на 4:16 рисуют? минус+больше не прокатывает - она неслитная получается)))) и >= на 9:35 - аналогичный вопрос
Это называется лигатуры, тебе нужны шрифты и немношк погуглить
stackoverflow.com/questions/49206685/how-to-convert-to-%E2%89%A0-and-to-%E2%86%92-in-android-studio
а кто такие ЯРДЫ? он когда здоровается на 0:16 говорит - "здорова, ярды"
Нерды :(
ru.wikipedia.org/wiki/%D0%9D%D0%B5%D1%80%D0%B4
Я вообще подумал Ярдрей, как раз после его ролика смотрю)
На 25 строчке в первом варианте: Exception in thread "main" java.lang.IndexOutOfBoundsException: Index 41 out of bounds for length 41
12:52 Так, либо лыжи не едут..
У меня так не работает с переменной "words".
Если делать так, как в видео - то она получается массивом(функций?) "val words: List"
Покурил бамбук, полечил таким образом:
.map { filterEnding(',')(it)} , т.е. я передаю в функцию в мапе "it", по идее так и должно быть. Но почему работает у вас тогда? Единственная разница - я в андроид студии пробую, она по другим правилам работает? ))
На скобки обрати внимание.
Можно map(filterending(“-“)), тогда у тебя лябмдой которую будет вызывать map станет то, сто вернет функция filterEnding.
Можно map { filterEnding(“-“)(it) } - так у тебя на одну лябмду больше будет
@@SeemsNerdy Ааа!! Вот это я валенок)) Работает, спасибо!
Но тут же созрел еще вопрос:
.map(String::toLowerCase)
.map(filterEnding(','))
.map(filterEnding('.'))
.flatMap { it.toList() }
.map { Log.i("MyLog", it.toString()) }
При таком подходе flatmap не выдает все, что должен а только первые 2 символа с каждого слова.
А вот если сюда понаставить бряк и по этому же коду пройтись в дебаг-режиме, то работает все корректно. Это как понимать? о_О
А можешь весь код куда-нибудь на gist.github.com закинуть?
@@SeemsNerdy вот этот код лежит в onCreate и выдает по 2 символа со слова
gist.github.com/MaScFx/39cbe6ca5a9bb85db7ac66bfcde69e4a
Что самое интересное, если его перенести без изменений в intellij idea- работает корректно.
А в андроид студии что с эмулятором что с реальным девайсом - по 2 символа.
скрин приложил там
Все ты правильно делаешь. Удали фильтр *MyLog* и увидишь там что-то в духе
*I/chatty: uid=10086(...) identical 5 lines*
Операционка видит что приложение одно и то же кидает в лог и затыкает его, вместо этого выводя вот такое вот.
Вообще может помочь: *adb logcat -P "UID"* , UID - тот который стоит напротив твоей package name в выводе *adb logcat -S* , в списке самых chattiest apps, но у меня правда эта пижня не заработала. Второй вариант - склей в строку и ее в лог
так, конечно, лучше, но, что эти недоделанные, которые про красивый код, что скажут?
Коротко для .Net разрабов:
map -> linq Select
flatMap -> linq SelectMany
fold -> по сути linq First
filter -> linq Where
fold -> linq Aggregate