Функции высшего порядка в Kotlin: map, flatMap, fold, filter - понятный компактный код
Вставка
- Опубліковано 4 жов 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"*
З.Ы.: концовки видео с питанием компа крутые
ЕЕеее :) Каеф :)
Поздравляю с первой сотней подписчиков :)
Данке шон, спасибо :)
Объясни пожалуйста когда пишешь код что к чему
А почему в первом случае нельзя было использовать хотя-бы split?
Лолька. Первый варик, в цикле if == array.length - 1. Если большой текст надо обработать - это так-то плохо. Лучше было - забить на последнее слово и после этого цикла добавить цикл с конца до первого пробела || . || ,. Ясно, что второй варик чаще используют, но все-таки мне бросился этот if в глаза. Хотя да, цель была не в этом - да. Так даже чуть больше кода и еще сложнее читать, ахахах. Но тем не менее, не сочтите за критику;-)
Спасибо!
На 9:38 какой кнопкой превратил >= в односимвольный аналог?
@@andrey7530 Тоесть в файлике это 2 символа, просто рендерится как 1?
Круто! Просто и понятно. Большое спасибо!
Здравствуйте! Отличное видео! Подскажите пожалуйста как будет выглядеть код с помощью map чтобы поменять букву в слове?
map применяется ко всем элементам
если нужно поменять одну букву то можно без map обойтись
Лучший!
Желаю успехов в развитии канала!
На RU зоне каналы по программированию раскрутить очень сложно. Но ведь кто то должен популяризировать программинг в России...
Спасибо. Я хочу проверить будет ли канал развиваться на одной лишь органике, без раскруток
Блин, про 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
На 25 строчке в первом варианте: Exception in thread "main" java.lang.IndexOutOfBoundsException: Index 41 out of bounds for length 41
Коротко для .Net разрабов:
map -> linq Select
flatMap -> linq SelectMany
fold -> по сути linq First
filter -> linq Where
fold -> linq Aggregate
а кто такие ЯРДЫ? он когда здоровается на 0:16 говорит - "здорова, ярды"
Нерды :(
ru.wikipedia.org/wiki/%D0%9D%D0%B5%D1%80%D0%B4
Я вообще подумал Ярдрей, как раз после его ролика смотрю)
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, но у меня правда эта пижня не заработала. Второй вариант - склей в строку и ее в лог
так, конечно, лучше, но, что эти недоделанные, которые про красивый код, что скажут?