ПредишенСледващото

Ламбда изрази Java 8

С една дума - да, разбира се.

За да се даде по-подробен отговор, нека все пак ще се разбере: защо ние работим с тях?

По същество, ламбда изрази са необходими, тъй като те се опише това, което изчисления трябва да бъдат извършени, а не как да ги изпълнява. Традиционно, ние работим с външен итерация, в който ясно се посочва цялата последователност на операциите, както и начина, по който са направени.

Външната итерация се извършва в една линия за. и този цикъл точно да посочи как се прави. Този код е излишно и многократно възпроизведени в програмите. Въпреки това, с forEach на цикъл ние поръчваме изкажат програма повикване (тук - в зависимост от метода, който е по-кратък, отколкото ламбда) за всяка позиция, но ние не трябва да се опише как работи цикъл. Итерацията се обработват в системата, на нивото на forEach линия.

Такава мотивация ", че вместо да" в случай на експресия ламбда е от основно значение. Но за да се разбере на веригата, е необходимо да се помисли за по-нататъшно мотивацията на функционалното програмиране като такива.

Ламбда vyrrazheniya / вериги са предназначени да се опрости функционално програмиране. Java 8 - разбира се, не функционален език, но това (както е в Python) вече се извършват някаква подкрепа за функционално програмиране, тези възможности са изградени върху основния обектно-ориентиран парадигма.
Основната идея на функционалното програмиране е, че можете да създадете функции и да ги манипулира, по-специално, да се създаде функции по време на изпълнение. Съответно, вашата програма може да се справи не само данни, но също и функции. Представете си какви възможности са отворени за програмист.

В чисто функционален език за програмиране, има и други ограничения, по-специално - инвариантност данни. Това означава, че не е нужно променливи, само неизменни ценности. На пръв поглед, това ограничение е прекалено (? Като цяло работи без променливи), но се оказва, че в действителност, като се използват стойностите, постигнати всички същите като на променливата (искате да направите - опитайте се да Скала, че този език не е чисто функционална но тя дава възможност да се насладите на всички стойности). Непроменими функции вземат аргументи и изход в резултат, без да се променя околната среда; много по-лесно да ги използват паралелно програмиране, тъй като инвариант функция не блокира споделените ресурси.
че е възможно да се създаде функции по време на работа само един начин до Java 8 освобождаване: генериране и зареди кода байт (това е доста сложна и трудна работа).

Lambda изрази се характеризират със следните две функции:

  1. По-кратък синтаксис, когато създавате функции
  2. Способността да се създаде функции по време на работа; След това тези функции могат да се прехвърлят към друг код или друг код и да действат.

Приключване грижа е възможност за втора

Каква е схемата?

Със затварянето на използваните променливи са разположени извън обхвата на функцията. В традиционния процедурно програмиране, това не е проблем - просто използвате променлива - но проблемът възниква веднага след като започне да се създаде функции по време на изпълнение. За да илюстрираме този проблем, първо да дам пример с Python. Тук make_fun () създава и връща функция, наречена func_to_return. което след това се използва и в останалата част на програмата:

Така че, ние сме изправени пред такъв проблем: ако просто се върнете func_to_return. че е п. извън видимостта на площ func_to_return. Обикновено може да се очаква, че п излиза от обхват и ще бъдат премахнати, но ако това се случи, то няма да работи func_to_return. В подкрепа на динамичното създаване на func_to_return трябва да "оттегли" функции около н и да се гарантира, че те "са оцелели", за да се върне функции. Следователно терминът "затваряне".

За да се тества make_fun (). ние го наричаме два пъти, а освен функцията резултат в х и у. Фактът, че х и у даде доста различни резултати, показва, че това на всеки make_fun повикване () е налице напълно независими със своя собствена функция func_to_return затворен склад за п.

Lambdas в Java 8

Помислете за същия пример в Java използване на ламбда изрази:

Оказва се, че lambdas в Java са затворени само около стойности, но не и около променливите. Java изисква, че тези стойности не са се променяли, като че ли сме обявиха своето окончателно. Така че, те трябва да бъдат окончателно независимо от това дали сте ги обявен така, или не. Това означава, че "виртуален окончателно." Ето защо, в Java е "верига с ограничения", а не "пълно" верига, които, обаче, са доста полезни.

Всички компилира без проблеми, за да се провери това може просто да постави окончателната дума в дефиницията на п. Разбира се, ако ние прилагаме подобен ход с който и да е конкуренция, има проблем с общ непостоянен състояние.

Lambda изрази - поне частично - може да се постигне желаната цел: сега е възможно да се създаде функции динамично. Ако отидете в чужбина, ще получите съобщение за грешка, но обикновено тези проблеми са решени. Изходът няма да бъде толкова лесно, колкото в Python, но тя все още е Java. И крайният резултат, а не без някои ограничения (нека си го кажем, всеки резултат в Java не е без някои ограничения), не е толкова лошо.

Чудех се защо тези структури се наричат ​​"lambdas", а не просто "закриване" - защото всички знаци са чисто съединение. Беше ми казано, че "затварянето" - лоша и претоварен план. Когато някой казва, че "реално верига", която често има предвид, като "затваряне", който го хвана първия научат език за програмиране, където има са по същество по-нататък "затваряне".

Аз не виждам тук спора "PLO срещу FP", обаче, и няма да го задържи. Нещо повече, аз дори "против" не виждам. Обектно-ориентиран е подходящ за абстракция на данни (и дори Java принуждава да работят с обекти, това не означава, че всеки проблем е решен с помощта на обекти), и фазов преход - до абстрактни поведение. И двете парадигми са полезни, и, по мое мнение, по-полезен, ако те са объркани - и в Python и Java 8. Наскоро имах възможността да работя с pandoc - преобразувател, написани на чисто функционален език Haskell, а аз все още имам голямата част от него положителен опит. Така че, чисто функционални езици, също заслужават място под слънцето.

Свързани статии

Подкрепете проекта - споделете линка, благодаря!