scala Iterable#map по сравнению с Iterable#flatMap

Вы не должны останавливаться на первом способе кодирования чего-то, что «работает».

Я действительно не думаю, что это должно быть спорным, но это так. Люди видят пример из другого места в коде, из Интернета или из какой-то старой книги «Научите себя продвинутому SQLJava # BeansServer за 3,14159 минут» за 1999 год, и они думают, что что-то знают, и копируют это в свой код. Они не идут по примеру, чтобы выяснить, что делает каждая строка. Они не думают о дизайне своей программы и не могут найти более организованный или более естественный способ сделать то же самое. Они не предпринимают никаких попыток поддерживать свои навыки в актуальном состоянии, чтобы понять, что они используют идеи и методы, которые устарели в последний год предыдущего тысячелетия. Похоже, у них нет опыта, чтобы понять, что то, что они копируют, годами создавало особую ужасную нагрузку на программистов, и что их можно избежать, если немного подумать.

На самом деле, они даже не осознают, что может быть несколько способов сделать что-то.

Я родом из мира Perl, где один из лозунгов: «Есть больше, чем один способ сделать это». (TMTOWTDI) Люди, которые бегло взглянули на Perl, списали его как «только для записи» или «нечитаемый», в основном потому, что смотрели на дерьмовый код, написанный людьми с менталитетом, который я описал выше. Эти люди не задумывались над дизайном, ремонтопригодностью, организацией, уменьшением дублирования в коде, связыванием, связностью, инкапсуляцией и т. Д. Они пишут дерьмо. У этих людей есть программирование на всех языках, и они легко изучают языки с множеством способов сделать что-то, что дает им много веревки и оружия, чтобы стрелять и вешаться. Одновременно.

Но если вы будете бродить по миру Perl дольше, чем беглый взгляд, и смотреть, что делают давние в сообществе, вы увидите замечательную вещь: хорошие программисты на Perl тратят некоторое время на поиски ] лучший способ что-то сделать. Когда они называют новый модуль, они спрашивают предложения и делятся своими идеями с людьми. Они раздают свой код, чтобы на него смотрели, критиковали и модифицировали. Если им нужно сделать что-то неприятное, они инкапсулируют это как можно меньше в модуле, чтобы использовать его более организованно. Несколько реализаций одной и той же идеи могут задерживаться на некоторое время, но они конкурируют за долю разума и долю рынка, и они конкурируют, пытаясь выполнить лучшую работу, и большую часть этого составляет то, что они легко обслуживаются. Действительно хорошие программисты на Perl, похоже, думают усердно о том, что они делают, и ищут лучший способ сделать что-то, вместо того, чтобы просто ухватиться за первую идею, которая пронизывает их мозг.

Сегодня я программирую в основном в мире Java. Я видел действительно хороший Java-код, но я также вижу много мусора и вижу больше мышления, которое я описал в начале: люди выбирают первый уродливый кусок кода, который, кажется, работает, не понимая его. не думая, есть ли лучший способ.

Вы увидите оба типа мышления на каждом языке. Я не пытаюсь оспаривать Java специально. (На самом деле мне это действительно нравится в некоторых отношениях ... может быть, это должно быть моим реальным противоречивым мнением!) Но я начинаю верить, что каждый программист должен провести хорошую пару лет с языком в стиле TMTOWTDI, потому что хотя Согласно общепринятому мнению, это приводит к хаосу и дрянному коду, на самом деле кажется, что он производит людей, которые понимают, что вам нужно подумать о последствиях того, что вы делаете, вместо того, чтобы доверять своему языку, который был разработан, чтобы заставить вас поступать правильно без усилий.

Я действительно думаю, что вы можете слишком ошибиться в другом направлении: то есть в перфекционизме, который полностью игнорирует ваши истинные потребности и цели (часто истинные потребности и цели вашего бизнеса, что обычно является прибыльностью). Но я не думаю, что кто-то может быть по-настоящему великим программистом, не научившись вкладывать больше усилий, чем обычно, в размышления о поиске лучшего (или хотя бы одного из лучших) способа кодирования того, что он делает.

58
задан Eugene Yokota 15 December 2010 в 22:42
поделиться

5 ответов

Вот довольно хорошее объяснение:

http://www.codecommit.com/blog / scala / scala-collections-for-the-easy-bored-part-2

Использование списка в качестве примера:

Подпись карты:

map [B](f : (A) => B) : List[B]

, а flatMap -

flatMap [B](f : (A) => Iterable[B]) : List[B]

Таким образом, flatMap принимает тип [A ] и возвращает повторяющийся тип [B], а map принимает тип [A] и возвращает тип [B]

Это также даст вам представление о том, что плоская карта будет «сглаживать» списки.

val l  = List(List(1,2,3), List(2,3,4))

println(l.map(_.toString)) // changes type from list to string
// prints List(List(1, 2, 3), List(2, 3, 4))

println(l.flatMap(x => x)) // "changes" type list to iterable
// prints List(1, 2, 3, 2, 3, 4)
44
ответ дан 24 November 2019 в 18:51
поделиться

Все вышесказанное верно, но есть еще одна удобная вещь: flatMap превращает List [Option [A]] в Список [A] , с любым параметром , который раскрывается до Нет , удален. Это ключевой концептуальный прорыв, позволяющий выйти за рамки использования null .

56
ответ дан 24 November 2019 в 18:51
поделиться
lines.map(line => line split "\\W+") // will return a list of arrays of words
lines.flatMap(line => line split "\\W+") // will return a list of words

Вы можете лучше увидеть это для понимания:

for {line <- lines
     word <- line split "\\W+"}
yield word.length

это переводится в:

lines.flatMap(line => line.split("\\W+").map(word => word.length))

Каждый итератор внутри for будет переведен в «flatMap», за исключением последнего, который переводится в «карту». Таким образом, вместо того, чтобы возвращать вложенные коллекции (список массива из буфера blah, blah, blah), вы возвращаете плоскую коллекцию. Коллекция, образованная полученными элементами - в данном случае список целых чисел.

8
ответ дан 24 November 2019 в 18:51
поделиться

Посмотрите здесь: http://www.codecommit.com/blog/scala/scala-collections-for-the-easily-bored-part-2

«Искать flatMap» - там есть действительно хорошее объяснение. . (В основном это комбинация слов «flatten» и «map» - функций из других языков).

3
ответ дан 24 November 2019 в 18:51
поделиться

Из scaladoc :

  • map

Возвращает итеративный результат от применения данной функции f к каждый элемент этой итерации.

  • flatMap

Применяет заданную функцию f к каждому элементу этой итерации, затем объединяет результаты.

8
ответ дан 24 November 2019 в 18:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: