Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Лямбда-выражения / 25 сообщений из 37, страница 1 из 2
20.03.2014, 18:11
    #38592222
Cpt. Gray
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Лямбда-выражения
Здравствуйте,

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

Щито это вообще такое? И где его использовать..?
Знаком с ООП, но не с функциональным подходом...
...
Рейтинг: 0 / 0
20.03.2014, 18:29
    #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
20.03.2014, 18:30
    #38592251
Usman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Лямбда-выражения
...
Рейтинг: 0 / 0
20.03.2014, 18:33
    #38592255
Паша01
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Лямбда-выражения
Cpt. GrayЗнаком с ООП, но не с функциональным подходом...
Немного не по теме, просто выскажусь.
У меня почти такая же ситуация и недавно прочитал статью Опасности обучения на Java и понял, что с моим подходом я как программист никто.
Так что просто совет, не спеши с ООП, функциональное программирование учит азам.
...
Рейтинг: 0 / 0
20.03.2014, 18:34
    #38592258
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Лямбда-выражения
...
Рейтинг: 0 / 0
20.03.2014, 19:28
    #38592301
Usman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Лямбда-выражения
...
Рейтинг: 0 / 0
20.03.2014, 19:36
    #38592310
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Лямбда-выражения
Вопрос банален - для чего нужны лямбда-выражения?

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



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


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

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

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

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

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

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

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

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

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

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

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

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

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

Рефлекшен на лямбду говорит, что это не анонимный класс. 15653776
...
Рейтинг: 0 / 0
22.03.2014, 21:41
    #38593749
breath
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Лямбда-выражения
если хочется функционального программирования под jvm то лучше сразу clojure, там и не пытаются смешать парадигмы, просто максимально близко реализовали проверенный lisp style c учетом специфики jvm и вызова готового java кода,
а тут получается такой же синтаксический ужас в целом как в scala, еще немного и будет хуже чем с++ по синтаксису имхо
...
Рейтинг: 0 / 0
23.03.2014, 02:32
    #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
23.03.2014, 17:08
    #38593979
just_vladimir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Лямбда-выражения
mayton,
судя по комментариям Сергея Куксенко высока вероятность, что реализация изменится:
http://habrahabr.ru/post/216303/#comment_7415965
http://habrahabr.ru/post/216303/#comment_7415907
...
Рейтинг: 0 / 0
23.03.2014, 19:42
    #38594018
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Лямбда-выражения
Мне нравится текущая реализация Java lamdbas. В ней нету new и сопутствующих накладных на работу с memory.
...
Рейтинг: 0 / 0
24.03.2014, 09:59
    #38594230
schwa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Лямбда-выражения
maytonМне нравится текущая реализация Java lamdbas. В ней нету new и сопутствующих накладных на работу с memory.
Есть т.к. invokeDynamic создает java.lang.invoke.CallSite
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / Лямбда-выражения / 25 сообщений из 37, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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