powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Лямбда-выражения
25 сообщений из 37, страница 1 из 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
25 сообщений из 37, страница 1 из 2
Форумы / Java [игнор отключен] [закрыт для гостей] / Лямбда-выражения
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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