|
|
|
Лямбда-выражения
|
|||
|---|---|---|---|
|
#18+
Здравствуйте, Вопрос банален - для чего нужны лямбда-выражения? Они просто позволяют создать анонимный объект с реализацией метода функционального интерфейса? Просто такой необычной формой записи? Щито это вообще такое? И где его использовать..? Знаком с ООП, но не с функциональным подходом... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.03.2014, 18:11 |
|
||
|
Лямбда-выражения
|
|||
|---|---|---|---|
|
#18+
Cpt. GrayВопрос банален - для чего нужны лямбда-выражения? Упростить использование функциональных подходов в Java. Без них большинство попыток реализовать что-то функционально превращется в нагромождение интерфейсов и анонимных классов. Синтаксический шум у анонимных классов ужасный на столько что даже в IDE добавляют возможность его скрывать. Cpt. GrayОни просто позволяют создать анонимный объект с реализацией метода функционального интерфейса? Анонимными бывают классы, а не объекты. На сколько я помню, это не совсем так. Лямды не обязательно реализуются через анонимные классы. Они имеют поддержку на уровне JVM и на низком уровне возможны другие способы реализации. Но в целом - да, функциональность у них почти идентичная. Но у лямбд помимо простого синтаксиса есть ещё и возможность ссылаться на методы и конструкторы. Cpt. GrayПросто такой необычной формой записи? Пусть и не привычной, но сильно упрощающей код. Cpt. GrayЩито это вообще такое? И где его использовать..? Мне кажется стоит почитать документацию к Guava http://code.google.com/p/guava-libraries/wiki/GuavaExplained По-моему это один из довольно доходчивых способов для Java программиста разобраться в функциональщине. Ещё вот доклады хорошие есть ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.03.2014, 18:29 |
|
||
|
Лямбда-выражения
|
|||
|---|---|---|---|
|
#18+
Cpt. GrayЗнаком с ООП, но не с функциональным подходом... Немного не по теме, просто выскажусь. У меня почти такая же ситуация и недавно прочитал статью Опасности обучения на Java и понял, что с моим подходом я как программист никто. Так что просто совет, не спеши с ООП, функциональное программирование учит азам. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.03.2014, 18:33 |
|
||
|
Лямбда-выражения
|
|||
|---|---|---|---|
|
#18+
Usman http://ru.wikipedia.org/wiki/Замыкание_(программирование) По поводу терминологии интересная тема: http://stackoverflow.com/questions/220658/what-is-the-difference-between-a-closure-and-a-lambda ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.03.2014, 18:34 |
|
||
|
Лямбда-выражения
|
|||
|---|---|---|---|
|
#18+
BlazkowiczUsman http://ru.wikipedia.org/wiki/Замыкание_(программирование) По поводу терминологии интересная тема: http://stackoverflow.com/questions/220658/what-is-the-difference-between-a-closure-and-a-lambda Спасибо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.03.2014, 19:28 |
|
||
|
Лямбда-выражения
|
|||
|---|---|---|---|
|
#18+
Вопрос банален - для чего нужны лямбда-выражения? Для того, чтобы не писать кучу ненужного кода. Они просто позволяют создать анонимный объект с реализацией метода функционального интерфейса? Просто такой необычной формой записи? Нет, они не создают объект. Они создают анонимную функцию. Может быть в Java конечно это и объект... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.03.2014, 19:36 |
|
||
|
Лямбда-выражения
|
|||
|---|---|---|---|
|
#18+
[quot MasterZivНет, они не создают объект. Они создают анонимную функцию. Может быть в Java конечно это и объект...[/quot] Нет они именно создают объект анонимного класса для интерфейса с одним единственным неопределенным методом, доопределяют его и вызывают. И это все скрывая в коде какой интерфейс они доопределили. Но в целом красиво. Если не считать, что четверть века назад в трубо паскакале можно было спокойно определять переменную типа функция, вызывать и менять ее значение и для любых типов функций с любым набором параметров. Но это было в эпоху процедурного программирования. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.03.2014, 23:19 |
|
||
|
Лямбда-выражения
|
|||
|---|---|---|---|
|
#18+
Сергей АрсеньевЕсли не считать, что четверть века назад в трубо паскакале можно было спокойно определять переменную типа функция, вызывать и менять ее значение и для любых типов функций с любым набором параметров. Но это было в эпоху процедурного программирования. Только нельзя было создавать анонимную функцию по месту и тем более замыкать ее на лексический контекст, в отличие от лиспа, в котором первое появилось лет за 10 до создания оригинального паскаля, а второе — за 8 до создания турбо паскаля. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.03.2014, 07:54 |
|
||
|
Лямбда-выражения
|
|||
|---|---|---|---|
|
#18+
Сергей Арсеньев[quot MasterZivНет, они не создают объект. Они создают анонимную функцию. Может быть в Java конечно это и объект... Нет они именно создают объект анонимного класса для интерфейса с одним единственным неопределенным методом, доопределяют его и вызывают. И это все скрывая в коде какой интерфейс они доопределили.[/quot] Нет, это всё-таки новая сущность в рантайме. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.03.2014, 09:47 |
|
||
|
Лямбда-выражения
|
|||
|---|---|---|---|
|
#18+
k0rvinТолько нельзя было создавать анонимную функцию по месту. Ну так старик Вирт был суров и считал, что определения должны быть в своем блоке, а исполнение в своем. Отсюда делаем вывод - прогресс он в ужесточении рамок. :) А отсюда - лямбда недорегресс. :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.03.2014, 11:19 |
|
||
|
Лямбда-выражения
|
|||
|---|---|---|---|
|
#18+
Alexey TominНет, это всё-таки новая сущность в рантайме. Ну да. Разница примерно как между synchronized method и synchronized block. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.03.2014, 11:24 |
|
||
|
Лямбда-выражения
|
|||
|---|---|---|---|
|
#18+
Сергей АрсеньевНу так старик Вирт был суров и считал, что определения должны быть в своем блоке, а исполнение в своем. Отсюда делаем вывод - прогресс он в ужесточении рамок. :) А отсюда - лямбда недорегресс. :) А еще он любил ключевые слова писать капсом и пропорциональный шрифт в исходниках. И учитывая, где теперь его детища, то сложно их назвать образцами прогресса. Да и давать имена функциям на каждый чих — явный маразм: зачем мне функция "greaterThan3", если проще написать "fun x -> x > 3" где надо? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.03.2014, 11:31 |
|
||
|
Лямбда-выражения
|
|||
|---|---|---|---|
|
#18+
k0rvinА еще он любил ключевые слова писать капсом и пропорциональный шрифт в исходниках. Как сделать пропорциональный шрифты на текстовом терминале? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.03.2014, 11:38 |
|
||
|
Лямбда-выражения
|
|||
|---|---|---|---|
|
#18+
не пропорциоальный ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.03.2014, 11:39 |
|
||
|
Лямбда-выражения
|
|||
|---|---|---|---|
|
#18+
Сергей АрсеньевКак сделать пропорциональный шрифты на текстовом терминале? А при чем тут текстовый терминал? http://en.wikipedia.org/wiki/Oberon_(operating_system) http://www.modulaware.com/images/SCREEN.jpg ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.03.2014, 12:03 |
|
||
|
Лямбда-выражения
|
|||
|---|---|---|---|
|
#18+
k0rvin, Паскаль - 68 год. Как бы и требования к красивостям возникли от привычек тех лет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.03.2014, 12:13 |
|
||
|
Лямбда-выражения
|
|||
|---|---|---|---|
|
#18+
Cpt. GrayВопрос банален - для чего нужны лямбда-выражения? В контексте Java/OOP - это сахарок такой. Просто оказалось что ссылки на функции весьма удобны и упрощают код. Подробнее для Java пишут тут: http://docs.oracle.com/javase/tutorial/java/javaOO/lambdaexpressions.html ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.03.2014, 13:25 |
|
||
|
Лямбда-выражения
|
|||
|---|---|---|---|
|
#18+
Сергей Арсеньев][quot MasterZivНет, они не создают объект. Они создают анонимную функцию. Может быть в Java конечно это и объект... Нет они именно создают объект анонимного класса для интерфейса с одним единственным неопределенным методом, доопределяют его и вызывают. И это все скрывая в коде какой интерфейс они доопределили. Но в целом красиво. Если не считать, что четверть века назад в трубо паскакале можно было спокойно определять переменную типа функция, вызывать и менять ее значение и для любых типов функций с любым набором параметров. Но это было в эпоху процедурного программирования.[/quot] Ну это вопрос реализации. Если они считают, что так лучше -- их дело. Главное, это всё руками писать не надо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.03.2014, 15:21 |
|
||
|
Лямбда-выражения
|
|||
|---|---|---|---|
|
#18+
Сергей АрсеньевНет они именно создают объект анонимного класса для интерфейса Не совсем. Тело функции (байткод) лежит в этом же файле, а не отдельном, инстанцируется не конкретный класс Example$999, а чёртЗнаетЧто сгенерированное в рантайме. Рефлекшен на лямбду говорит, что это не анонимный класс. 15653776 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.03.2014, 17:20 |
|
||
|
Лямбда-выражения
|
|||
|---|---|---|---|
|
#18+
если хочется функционального программирования под jvm то лучше сразу clojure, там и не пытаются смешать парадигмы, просто максимально близко реализовали проверенный lisp style c учетом специфики jvm и вызова готового java кода, а тут получается такой же синтаксический ужас в целом как в scala, еще немного и будет хуже чем с++ по синтаксису имхо ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.03.2014, 21:41 |
|
||
|
Лямбда-выражения
|
|||
|---|---|---|---|
|
#18+
Вот где порылась собака. Лямбды реализованы как приватные статические функции с префиксом "lambda$" в текущем классе. Выхлоп javap показывает что просто используется пара инструкций invokedynamic, invokestatic. Обе описаны в спецификации JVM-7 и не являются чем-то новым. Рискну предположить что лямбды не вносят изменения в спецификацию байткода машины. И хотя в шапке версия прыгнула на c 51 на 52 думаю что лямбды здесь непричём а просто идёт некая другая эволюция JVM. Вобщем, коллеги, получИте свои обещанные синтаксические сладости и распишитесь. Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.03.2014, 02:32 |
|
||
|
Лямбда-выражения
|
|||
|---|---|---|---|
|
#18+
mayton, судя по комментариям Сергея Куксенко высока вероятность, что реализация изменится: http://habrahabr.ru/post/216303/#comment_7415965 http://habrahabr.ru/post/216303/#comment_7415907 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.03.2014, 17:08 |
|
||
|
Лямбда-выражения
|
|||
|---|---|---|---|
|
#18+
Мне нравится текущая реализация Java lamdbas. В ней нету new и сопутствующих накладных на работу с memory. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.03.2014, 19:42 |
|
||
|
Лямбда-выражения
|
|||
|---|---|---|---|
|
#18+
maytonМне нравится текущая реализация Java lamdbas. В ней нету new и сопутствующих накладных на работу с memory. Есть т.к. invokeDynamic создает java.lang.invoke.CallSite ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.03.2014, 09:59 |
|
||
|
Лямбда-выражения
|
|||
|---|---|---|---|
|
#18+
schwamaytonМне нравится текущая реализация Java lamdbas. В ней нету new и сопутствующих накладных на работу с memory. Есть т.к. invokeDynamic создает java.lang.invoke.CallSite Может не создаёт а использует? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.03.2014, 11:54 |
|
||
|
Лямбда-выражения
|
|||
|---|---|---|---|
|
#18+
schwamaytonМне нравится текущая реализация Java lamdbas. В ней нету new и сопутствующих накладных на работу с memory. Есть т.к. invokeDynamic создает java.lang.invoke.CallSite Класс создаётся, объект- нет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.03.2014, 12:55 |
|
||
|
Лямбда-выражения
|
|||
|---|---|---|---|
|
#18+
А как же тогда лямбда занет о контексте? Если лямбда - это вызов статического метода, то как она этот контекст туда пробрасывает? через аргументы? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.03.2014, 14:40 |
|
||
|
Лямбда-выражения
|
|||
|---|---|---|---|
|
#18+
For AllА как же тогда лямбда занет о контексте? КАК-ТО :) Ещё раз- сейчас лямбда- это статический метод основного класса. Все переменные класса видятся очевидным образом. Переменные верхнего метода- как-то сделали, тут сложностей особо нет. А класс создаётся для getClass() и т.п. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.03.2014, 15:01 |
|
||
|
Лямбда-выражения
|
|||
|---|---|---|---|
|
#18+
For AllА как же тогда лямбда занет о контексте? Если лямбда - это вызов статического метода, то как она этот контекст туда пробрасывает? через аргументы? А как-бы никак. Для лямбды просто необязательно писать final у тех переменных что используются в лямбде. На самом деле они неявно подразумеваются и в случае попытки исправить - ошибка. Зато букаф меньше. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.03.2014, 18:35 |
|
||
|
Лямбда-выражения
|
|||
|---|---|---|---|
|
#18+
Сергей Арсеньев Для лямбды просто необязательно писать final у тех переменных что используются в лямбде. На самом деле они неявно подразумеваются и в случае попытки исправить - ошибка. Effective Final к вопросу захвата контекста отношение имеет посредственное. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.03.2014, 18:39 |
|
||
|
Лямбда-выражения
|
|||
|---|---|---|---|
|
#18+
Alexey TominКласс создаётся, объект- нет. Наоборот же. Объект создаётся. Ведь в результате мы имеем экземпляр. А вот класс не создаётся. Создаётся метод, который на уровне реализации JVM может любым способом быть связан с экземляром (объектом). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.03.2014, 18:41 |
|
||
|
Лямбда-выражения
|
|||
|---|---|---|---|
|
#18+
schwaЕсть т.к. invokeDynamic создает java.lang.invoke.CallSite Экземпляр анонимного класса создаётся при каждом вызове. А CallSite только один раз для определенной лямбды. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.03.2014, 18:43 |
|
||
|
Лямбда-выражения
|
|||
|---|---|---|---|
|
#18+
BlazkowiczEffective Final к вопросу захвата контекста отношение имеет посредственное. Визуально создает ощущение. А на самом деле нет. Но может For All имел ввиду что-то еще? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.03.2014, 18:43 |
|
||
|
Лямбда-выражения
|
|||
|---|---|---|---|
|
#18+
Alexey TominКАК-ТО :) Ещё раз- сейчас лямбда- это статический метод основного класса. Все переменные класса видятся очевидным образом. Переменные верхнего метода- как-то сделали, тут сложностей особо нет. А класс создаётся для getClass() и т.п. Какой класс создаётся? Вот тут во второй половине доклада есть немного о реализации http://jeeconf.com/archive/jeeconf-2013/materials/jdk8-lambda/ ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.03.2014, 18:44 |
|
||
|
Лямбда-выражения
|
|||
|---|---|---|---|
|
#18+
Сергей АрсеньевBlazkowiczEffective Final к вопросу захвата контекста отношение имеет посредственное. Визуально создает ощущение. А на самом деле нет. Но может For All имел ввиду что-то еще? Я имел ввиду следующее: имеется метод возвращающий лямбду Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. Тут лямбда зависит от параметров создающего её метода (double a). Если реализация лямбды (т.е. тело: (x)->a*x) - это некий статический метод, то как тогда внутри этого тела становится доступным конкретне значение параметра (double a)? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.03.2014, 14:10 |
|
||
|
Лямбда-выражения
|
|||
|---|---|---|---|
|
#18+
For AllЕсли реализация лямбды (т.е. тело: (x)->a*x) - это некий статический метод, то как тогда внутри этого тела становится доступным конкретне значение параметра (double a)? http://jeeconf.com/archive/jeeconf-2013/materials/jdk8-lambda/ Перемотайте на 36:44 - вроде все захваченные переменные перемещаются в аргументы метода. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.03.2014, 14:25 |
|
||
|
|

start [/forum/topic.php?all=1&fid=59&tid=2127445]: |
0ms |
get settings: |
7ms |
get forum list: |
16ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
397ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
79ms |
get tp. blocked users: |
2ms |
| others: | 228ms |
| total: | 746ms |

| 0 / 0 |
