powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Лямбда-выражения
37 сообщений из 37, показаны все 2 страниц
Лямбда-выражения
    #38592222
Cpt. Gray
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Здравствуйте,

Вопрос банален - для чего нужны лямбда-выражения?
Они просто позволяют создать анонимный объект с реализацией метода функционального интерфейса?
Просто такой необычной формой записи?

Щито это вообще такое? И где его использовать..?
Знаком с ООП, но не с функциональным подходом...
...
Рейтинг: 0 / 0
Лямбда-выражения
    #38592250
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cpt. GrayВопрос банален - для чего нужны лямбда-выражения?

Упростить использование функциональных подходов в Java. Без них большинство попыток реализовать что-то функционально превращется в нагромождение интерфейсов и анонимных классов.
Синтаксический шум у анонимных классов ужасный на столько что даже в IDE добавляют возможность его скрывать.

Cpt. GrayОни просто позволяют создать анонимный объект с реализацией метода функционального интерфейса?

Анонимными бывают классы, а не объекты. На сколько я помню, это не совсем так. Лямды не обязательно реализуются через анонимные классы. Они имеют поддержку на уровне JVM и на низком уровне возможны другие способы реализации. Но в целом - да, функциональность у них почти идентичная. Но у лямбд помимо простого синтаксиса есть ещё и возможность ссылаться на методы и конструкторы.

Cpt. GrayПросто такой необычной формой записи?

Пусть и не привычной, но сильно упрощающей код.

Cpt. GrayЩито это вообще такое? И где его использовать..?

Мне кажется стоит почитать документацию к Guava
http://code.google.com/p/guava-libraries/wiki/GuavaExplained
По-моему это один из довольно доходчивых способов для Java программиста разобраться в функциональщине.

Ещё вот доклады хорошие есть
YouTube Video
...
Рейтинг: 0 / 0
Лямбда-выражения
    #38592251
Фотография Usman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Лямбда-выражения
    #38592255
Фотография Паша01
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cpt. GrayЗнаком с ООП, но не с функциональным подходом...
Немного не по теме, просто выскажусь.
У меня почти такая же ситуация и недавно прочитал статью Опасности обучения на Java и понял, что с моим подходом я как программист никто.
Так что просто совет, не спеши с ООП, функциональное программирование учит азам.
...
Рейтинг: 0 / 0
Лямбда-выражения
    #38592258
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Лямбда-выражения
    #38592301
Фотография Usman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Лямбда-выражения
    #38592310
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вопрос банален - для чего нужны лямбда-выражения?

Для того, чтобы не писать кучу ненужного кода.



Они просто позволяют создать анонимный объект с реализацией метода функционального интерфейса?
Просто такой необычной формой записи?


Нет, они не создают объект. Они создают анонимную функцию. Может быть в Java конечно это и объект...
...
Рейтинг: 0 / 0
Лямбда-выражения
    #38592411
Сергей Арсеньев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[quot MasterZivНет, они не создают объект. Они создают анонимную функцию. Может быть в Java конечно это и объект...[/quot]
Нет они именно создают объект анонимного класса для интерфейса с одним единственным неопределенным методом, доопределяют его и вызывают. И это все скрывая в коде какой интерфейс они доопределили.
Но в целом красиво. Если не считать, что четверть века назад в трубо паскакале можно было спокойно определять переменную типа функция, вызывать и менять ее значение и для любых типов функций с любым набором параметров. Но это было в эпоху процедурного программирования.
...
Рейтинг: 0 / 0
Лямбда-выражения
    #38592527
Фотография k0rvin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сергей АрсеньевЕсли не считать, что четверть века назад в трубо паскакале можно было спокойно определять переменную типа функция, вызывать и менять ее значение и для любых типов функций с любым набором параметров. Но это было в эпоху процедурного программирования.
Только нельзя было создавать анонимную функцию по месту и тем более замыкать ее на лексический контекст, в отличие от лиспа, в котором первое появилось лет за 10 до создания оригинального паскаля, а второе — за 8 до создания турбо паскаля.
...
Рейтинг: 0 / 0
Лямбда-выражения
    #38592596
Alexey Tomin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сергей Арсеньев[quot MasterZivНет, они не создают объект. Они создают анонимную функцию. Может быть в Java конечно это и объект...
Нет они именно создают объект анонимного класса для интерфейса с одним единственным неопределенным методом, доопределяют его и вызывают. И это все скрывая в коде какой интерфейс они доопределили.[/quot]

Нет, это всё-таки новая сущность в рантайме.
...
Рейтинг: 0 / 0
Лямбда-выражения
    #38592692
Сергей Арсеньев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
k0rvinТолько нельзя было создавать анонимную функцию по месту.
Ну так старик Вирт был суров и считал, что определения должны быть в своем блоке, а исполнение в своем.

Отсюда делаем вывод - прогресс он в ужесточении рамок. :)

А отсюда - лямбда недорегресс. :)
...
Рейтинг: 0 / 0
Лямбда-выражения
    #38592699
Сергей Арсеньев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexey TominНет, это всё-таки новая сущность в рантайме.
Ну да. Разница примерно как между synchronized method и synchronized block.
...
Рейтинг: 0 / 0
Лямбда-выражения
    #38592705
Фотография k0rvin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сергей АрсеньевНу так старик Вирт был суров и считал, что определения должны быть в своем блоке, а исполнение в своем.

Отсюда делаем вывод - прогресс он в ужесточении рамок. :)

А отсюда - лямбда недорегресс. :)

А еще он любил ключевые слова писать капсом и пропорциональный шрифт в исходниках. И учитывая, где теперь его детища, то сложно их назвать образцами прогресса. Да и давать имена функциям на каждый чих — явный маразм: зачем мне функция "greaterThan3", если проще написать "fun x -> x > 3" где надо?
...
Рейтинг: 0 / 0
Лямбда-выражения
    #38592715
Сергей Арсеньев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
k0rvinА еще он любил ключевые слова писать капсом и пропорциональный шрифт в исходниках.
Как сделать пропорциональный шрифты на текстовом терминале?
...
Рейтинг: 0 / 0
Лямбда-выражения
    #38592716
Сергей Арсеньев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
не пропорциоальный
...
Рейтинг: 0 / 0
Лямбда-выражения
    #38592752
Фотография k0rvin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сергей АрсеньевКак сделать пропорциональный шрифты на текстовом терминале?

А при чем тут текстовый терминал?

http://en.wikipedia.org/wiki/Oberon_(operating_system)
http://www.modulaware.com/images/SCREEN.jpg
...
Рейтинг: 0 / 0
Лямбда-выражения
    #38592766
Сергей Арсеньев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
k0rvin,

Паскаль - 68 год. Как бы и требования к красивостям возникли от привычек тех лет.
...
Рейтинг: 0 / 0
Лямбда-выражения
    #38592864
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cpt. GrayВопрос банален - для чего нужны лямбда-выражения?
В контексте Java/OOP - это сахарок такой. Просто оказалось что ссылки на функции
весьма удобны и упрощают код.

Подробнее для Java пишут тут:

http://docs.oracle.com/javase/tutorial/java/javaOO/lambdaexpressions.html
...
Рейтинг: 0 / 0
Лямбда-выражения
    #38593031
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сергей Арсеньев][quot MasterZivНет, они не создают объект. Они создают анонимную функцию. Может быть в Java конечно это и объект...
Нет они именно создают объект анонимного класса для интерфейса с одним единственным неопределенным методом, доопределяют его и вызывают. И это все скрывая в коде какой интерфейс они доопределили.
Но в целом красиво. Если не считать, что четверть века назад в трубо паскакале можно было спокойно определять переменную типа функция, вызывать и менять ее значение и для любых типов функций с любым набором параметров. Но это было в эпоху процедурного программирования.[/quot]

Ну это вопрос реализации. Если они считают, что так лучше -- их дело. Главное, это всё руками писать не надо.
...
Рейтинг: 0 / 0
Лямбда-выражения
    #38593634
avp.mk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сергей АрсеньевНет они именно создают объект анонимного класса для интерфейса
Не совсем. Тело функции (байткод) лежит в этом же файле, а не отдельном, инстанцируется не конкретный класс Example$999, а чёртЗнаетЧто сгенерированное в рантайме.

Рефлекшен на лямбду говорит, что это не анонимный класс. 15653776
...
Рейтинг: 0 / 0
Лямбда-выражения
    #38593749
breath
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
если хочется функционального программирования под jvm то лучше сразу clojure, там и не пытаются смешать парадигмы, просто максимально близко реализовали проверенный lisp style c учетом специфики jvm и вызова готового java кода,
а тут получается такой же синтаксический ужас в целом как в scala, еще немного и будет хуже чем с++ по синтаксису имхо
...
Рейтинг: 0 / 0
Лямбда-выражения
    #38593808
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот где порылась собака. Лямбды реализованы как приватные статические функции с префиксом "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.
.....
    public static void main(String[] args){

        List<Person> roster = new ArrayList<Person>();

        printPersons(roster, new CheckPersonEligibleForSelectiveService());

        printPersons(
                roster,
                new CheckPerson() {
                    public boolean test(Person p) {
                        return p.getGender() == Person.Sex.MALE
                                && p.getAge() >= 18
                                && p.getAge() <= 25;
                    }
                }
        );

        printPersons(
                roster,
                new CheckPerson() {
                    public boolean test(Person p) {
                        return p.getAge() >= 0 && p.getAge() <= 99;
                    }
                }
        );

        printPersons(
                roster,
                (Person p) ->
                        p.getGender() == Person.Sex.MALE
                        && p.getAge() >= 18
                        && p.getAge() <= 25
        );

          printPersons(
                roster,
                (Person p) -> p.getGender() == Person.Sex.FEMALE
        );
    }



Код: 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.
  public static void main(java.lang.String[]);
    Code:
       0: new           #9                  // class java/util/ArrayList
       3: dup           
       4: invokespecial #10                 // Method java/util/ArrayList."<init>":()V
       7: astore_1      
       8: aload_1       
       9: new           #11                 // class CheckPersonEligibleForSelectiveService
      12: dup           
      13: invokespecial #12                 // Method CheckPersonEligibleForSelectiveService."<init>":()V
      16: invokestatic  #13                 // Method printPersons:(Ljava/util/List;LCheckPerson;)V
      19: aload_1       
      20: new           #14                 // class Main$1
      23: dup           
      24: invokespecial #15                 // Method Main$1."<init>":()V
      27: invokestatic  #13                 // Method printPersons:(Ljava/util/List;LCheckPerson;)V
      30: aload_1       
      31: new           #16                 // class Main$2
      34: dup           
      35: invokespecial #17                 // Method Main$2."<init>":()V
      38: invokestatic  #13                 // Method printPersons:(Ljava/util/List;LCheckPerson;)V
      41: aload_1       
        42: invokedynamic #18,  0             // InvokeDynamic #0:test:()LCheckPerson;
      47: invokestatic  #13                 // Method printPersons:(Ljava/util/List;LCheckPerson;)V
      50: aload_1       
        51: invokedynamic #19,  0             // InvokeDynamic #1:test:()LCheckPerson;
      56: invokestatic  #13                 // Method printPersons:(Ljava/util/List;LCheckPerson;)V
      59: return        

  private static boolean lambda$main$1(Person);
    Code:
       0: aload_0       
       1: invokevirtual #20                 // Method Person.getGender:()LPerson$Sex;
       4: getstatic     #21                 // Field Person$Sex.FEMALE:LPerson$Sex;
       7: if_acmpne     14
      10: iconst_1      
      11: goto          15
      14: iconst_0      
      15: ireturn       

  private static boolean lambda$main$0(Person);
    Code:
       0: aload_0       
       1: invokevirtual #20                 // Method Person.getGender:()LPerson$Sex;
       4: getstatic     #22                 // Field Person$Sex.MALE:LPerson$Sex;
       7: if_acmpne     32
      10: aload_0       
      11: invokevirtual #8                  // Method Person.getAge:()I
      14: bipush        18
      16: if_icmplt     32
      19: aload_0       
      20: invokevirtual #8                  // Method Person.getAge:()I
      23: bipush        25
      25: if_icmpgt     32
      28: iconst_1      
      29: goto          33
      32: iconst_0      
      33: ireturn       
}
...
Рейтинг: 0 / 0
Лямбда-выражения
    #38593979
just_vladimir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton,
судя по комментариям Сергея Куксенко высока вероятность, что реализация изменится:
http://habrahabr.ru/post/216303/#comment_7415965
http://habrahabr.ru/post/216303/#comment_7415907
...
Рейтинг: 0 / 0
Лямбда-выражения
    #38594018
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мне нравится текущая реализация Java lamdbas. В ней нету new и сопутствующих накладных на работу с memory.
...
Рейтинг: 0 / 0
Лямбда-выражения
    #38594230
Фотография schwa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonМне нравится текущая реализация Java lamdbas. В ней нету new и сопутствующих накладных на работу с memory.
Есть т.к. invokeDynamic создает java.lang.invoke.CallSite
...
Рейтинг: 0 / 0
Лямбда-выражения
    #38594351
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
schwamaytonМне нравится текущая реализация Java lamdbas. В ней нету new и сопутствующих накладных на работу с memory.
Есть т.к. invokeDynamic создает java.lang.invoke.CallSite
Может не создаёт а использует?
...
Рейтинг: 0 / 0
Лямбда-выражения
    #38594435
Alexey Tomin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
schwamaytonМне нравится текущая реализация Java lamdbas. В ней нету new и сопутствующих накладных на работу с memory.
Есть т.к. invokeDynamic создает java.lang.invoke.CallSite

Класс создаётся, объект- нет.
...
Рейтинг: 0 / 0
Лямбда-выражения
    #38594655
For All
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А как же тогда лямбда занет о контексте? Если лямбда - это вызов статического метода, то как она этот контекст туда пробрасывает? через аргументы?
...
Рейтинг: 0 / 0
Лямбда-выражения
    #38594698
Alexey Tomin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
For AllА как же тогда лямбда занет о контексте?

КАК-ТО :)
Ещё раз- сейчас лямбда- это статический метод основного класса. Все переменные класса видятся очевидным образом. Переменные верхнего метода- как-то сделали, тут сложностей особо нет. А класс создаётся для getClass() и т.п.
...
Рейтинг: 0 / 0
Лямбда-выражения
    #38595025
Сергей Арсеньев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
For AllА как же тогда лямбда занет о контексте? Если лямбда - это вызов статического метода, то как она этот контекст туда пробрасывает? через аргументы?
А как-бы никак.
Для лямбды просто необязательно писать final у тех переменных что используются в лямбде.
На самом деле они неявно подразумеваются и в случае попытки исправить - ошибка.
Зато букаф меньше.
...
Рейтинг: 0 / 0
Лямбда-выражения
    #38595030
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сергей Арсеньев Для лямбды просто необязательно писать final у тех переменных что используются в лямбде.
На самом деле они неявно подразумеваются и в случае попытки исправить - ошибка.
Effective Final к вопросу захвата контекста отношение имеет посредственное.
...
Рейтинг: 0 / 0
Лямбда-выражения
    #38595036
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexey TominКласс создаётся, объект- нет.
Наоборот же.
Объект создаётся. Ведь в результате мы имеем экземпляр.
А вот класс не создаётся. Создаётся метод, который на уровне реализации JVM может любым способом быть связан с экземляром (объектом).
...
Рейтинг: 0 / 0
Лямбда-выражения
    #38595038
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
schwaЕсть т.к. invokeDynamic создает java.lang.invoke.CallSite
Экземпляр анонимного класса создаётся при каждом вызове. А CallSite только один раз для определенной лямбды.
...
Рейтинг: 0 / 0
Лямбда-выражения
    #38595039
Сергей Арсеньев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczEffective Final к вопросу захвата контекста отношение имеет посредственное.
Визуально создает ощущение. А на самом деле нет. Но может For All имел ввиду что-то еще?
...
Рейтинг: 0 / 0
Лямбда-выражения
    #38595041
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexey TominКАК-ТО :)
Ещё раз- сейчас лямбда- это статический метод основного класса. Все переменные класса видятся очевидным образом. Переменные верхнего метода- как-то сделали, тут сложностей особо нет. А класс создаётся для getClass() и т.п.
Какой класс создаётся?
Вот тут во второй половине доклада есть немного о реализации
http://jeeconf.com/archive/jeeconf-2013/materials/jdk8-lambda/
...
Рейтинг: 0 / 0
Лямбда-выражения
    #38595730
For All
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сергей АрсеньевBlazkowiczEffective Final к вопросу захвата контекста отношение имеет посредственное.
Визуально создает ощущение. А на самом деле нет. Но может For All имел ввиду что-то еще?
Я имел ввиду следующее: имеется метод возвращающий лямбду

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
@FunctionalInterface
interface Formula {
    double value(double x);
}
...
Formula multiplier(double a) {
    return (x) -> a * x;
}
...
multiplier(5).value(10); // должно вернуть 50
multiplier(3).value(10); // должно вернуть 30



Тут лямбда зависит от параметров создающего её метода (double a).

Если реализация лямбды (т.е. тело: (x)->a*x) - это некий статический метод, то как тогда внутри этого тела становится доступным конкретне значение параметра (double a)?
...
Рейтинг: 0 / 0
Лямбда-выражения
    #38595756
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
For AllЕсли реализация лямбды (т.е. тело: (x)->a*x) - это некий статический метод, то как тогда внутри этого тела становится доступным конкретне значение параметра (double a)?
http://jeeconf.com/archive/jeeconf-2013/materials/jdk8-lambda/
Перемотайте на 36:44 - вроде все захваченные переменные перемещаются в аргументы метода.
...
Рейтинг: 0 / 0
37 сообщений из 37, показаны все 2 страниц
Форумы / Java [игнор отключен] [закрыт для гостей] / Лямбда-выражения
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]