Možnosti deklarativního programování v jazyce Java 8

Rozměr: px
Začít zobrazení ze stránky:

Download "Možnosti deklarativního programování v jazyce Java 8"

Transkript

1 Vysoká škola ekonomická v Praze Fakulta informatiky a statistiky Katedra informačních technologií Studijní program: Aplikovaná informatika Obor: Informační systémy a technologie Možnosti deklarativního programování v jazyce Java 8 DIPLOMOVÁ PRÁCE Student : Bc. Maxim Rytych Vedoucí : Ing. Rudolf Pecinovský, Csc. Oponent : Ing. Jarmila Pavlíčková, Ph.D. 2015

2 Prohlášení: Prohlašuji, že jsem diplomovou práci zpracoval samostatně a že jsem uvedl všechny použité prameny a literaturu, ze které jsem čerpal. V Praze dne 14. prosince Maxim Rytych

3 Poděkování Na tomto místě bych rád poděkoval svým nejbližším za podporu: mojí rodině a nejbližším přátelům, bez nichž bych se ke studiu vysoké školy zřejmě vůbec neodhodlal. Dále bych chtěl poděkovat vedoucímu mé práce panu Ing. Rudolfu Pecinovskému, CSc., za velmi vstřícný přístup, trpělivost, cenné připomínky, rady a množství času, které mi při vypracovávání diplomové práce věnoval.

4 Abstrakt Tato práce se zabývá možnostmi deklarativního programování v nové verzi jazyka Java 8, a to konkrétně prostřednictvím prvků převzatých z domény funkcionálních programovacích jazyků v podobě funkce jako hodnoty a proudů dat využívajících odloženého vyhodnocení nazývaných v této práci termínem datovody. Cílem práce je předvést možnosti deklarativního programování prostřednictvím těchto prvků, analyzovat jejich implementaci a předvést, jak navrhnout vlastní řešení. Přínos práce spočívá zejména v ukázce možností nových prvků, rozboru jejich implementace a návrhu vlastního řešení. Výstupy může použít český čtenář, alespoň mírně pokročilý v oboru informačních technologií. Práce je rozdělena na část teoretickou a praktickou. Teoretická část je pokryta kapitolami 3-8. Teoretická část hovoří o motivaci zavedení nových prvků, popisuje funkcionální programování a jeho základní principy, poté ukazuje principy nově zavedených prvků a končí popisem balíčku java.util.stream. Praktická část je pokryta kapitolami 9 a 10. V praktické části jsou popsány operace datovodů a ukázány příklady vlastních řešení. Klíčová slova Java 8, deklarativní programování, funkcionální programování, lambda-výrazy, odkazy na metody, datovody, balíček java.util.stream, funkční interfejs, implicitní metody, interfejs Collector, interfejs Spliterator

5 Abstract This paper concerns itself with possibilities of declarative programming in the new version of Java 8 language, specifically using elements adopted from the domain of functional programming languages function as a value and lazy streams of data. The goal of this paper is to demonstrate possibilities of declarative programming using these elements, analyze its implementation and design own extensions. The contribution lies particularly in showing possibilities of the new elements, implementation analysis and design of a new functionality. The output can be used by a Czech reader, who is at least slightly advanced in the field of information technologies. The paper is divided into a theoretical and practical parts. Theoretical part is covered by chapters 3-8. Theoretical part describes motivation for introduction of the new elements, describes functional programming and its basic principles, then it shows basic principles of the newly introducted elements and ends with the description of the java.util.stream package. Pactical part is covered by chapters 9 and 10. Practical part concerns with stream operations and extension design of existing functionality. Keywords Java 8, declarative programming, functional programming, lambda-expressions, method references, Streams, java.util.stream package, functional interface, default methods, Collector interface, Spliterator interface

6 Obsah 1 Úvod Vymezení tématu práce a důvod výběru tématu Cíle práce Způsob/metoda dosažení cíle Struktura práce Výstupy práce a očekávané přínosy Rešerše zdrojů Motivace změn v Javě Funkcionální programování λ-kalkul Redukce a konverze Charakteristické prvky funkcionálních programovacích jazyků Funkce jako entity první úrovně Funkce vyššího řádu Odkazová transparentnost Neměnnost stavů Odložené vyhodnocení Absence vedlejších efektů Deklarativní způsob programování Funkcionální prvky v Javě Funkce jako hodnota Lambda-výrazy Seznam s odloženým vyhodnocením Datovody Lambda-výrazy (a odkazy na metody) Funkční interfejs Syntaxe lambda-výrazů Odkazování na metody Od parametrizace hodnot k lambdám Datovody Datovody jako seznamy s odloženým vyhodnocením Řetězení operací Názornější příklad... 32

7 8 Balíček java.util.stream Charakteristické prvky balíčku java.util.stream Datovody a kolekce Interní a externí iterátory Vytváření datovodů Operace s datovody Stavové a bezestavové průběžné operace Omezené a neomezené stavové operace Paralelní zpracování Bezkonfliktnost Bezstavové chování Vedlejší efekty Pořadí Redukce Proměnná redukce Asociativita Nízkoúrovňová konstrukce datovodů Obsah balíčku java.util.stream Interfejs BaseStream<T,S extends BaseStream<T,S>> Interfejs Collector<T,A,R> Interfejs Stream<T> Interfejs Stream.Builder<T> Specializované interfejsy pro primitivní datové typy Třída Collectors Třída StreamSupport Výčtový typ Collector.Characteristics Další prvky Javy 8 související s datovody Interfejs Spliterator<T> Třída Optional<T> Implicitní metody Operace s datovody Aplikace na zápis a čtení XML souborů Aplikace na zápis XML souborů Aplikace na čtení XML souborů Jednoduché koncové operace Zjištění, zda existuje alespoň jeden prvek splňující danou podmínku Zjištění, zda všechny prvky splňují danou podmínku Zjištění, zda ani jeden z prvků nesplňuje danou podmínku Získání libovolného prvku Získání prvního prvku... 68

8 9.2.6 Vyhledání maximální a minimální hodnoty Počet prvků Provedení operace pro každý prvek Provedení operace pro každý prvek při respektování implicitního pořadí Získání prvků v podobě pole Průběžné operace Filtrování Mapování Řazení Nalezení unikátních prvků Omezení počtu prvků Přeskočení prvků Provedení operace pro každý prvek Vytvoření datovodu o jednom nebo více prvcích Spojení datovodů Vytvoření prázdného datovodu Vytvoření datovodu generováním Vytvoření datovodu iterováním Mapování na jednu úroveň Složité koncové operace Redukce Sběr Další metody třídy Collectors Metody averaging Metoda collectingandthen() Metody joining Metoda mapping() Metody summarizing Metody summing Metoda tocollection() Metoda toset() Vlastní řešení Interfejs IStreamable<T> Implementace vlastního kolektoru Implementace vlastního spliterátoru Závěr 106 Terminologický slovník

9 Seznam literatury

10 1 Úvod 1 1 Úvod V březnu roku 2014 vydala společnost Oracle novou, osmou, verzi populárního programovacího jazyka Java. Zřejmě nejvýznamnější změnou bylo zavedení prvků převzatých z domény funkcionálních programovacích jazyků proudů dat funkcionálního stylu nazývaných v této práci termínem datovody, a s nimi souvisejícího prvku umožňujícího pracovat s funkcí jako hodnotou v podobě lambda-výrazů či odkazů na metody. Množinu těchto prvků dále doplňují konstrukce jako funkční interfejs nebo implicitní metody, z nichž posledně jmenované přináší poměrně významnou změnu z pohledu návrhu architektury programů, neboť zavádí jistou možnost vícenásobného dědění implementace. Jádro datovodů se nachází v balíčku java.util.stream, ale některé fundamentální prvky jsou mimo tento balíček jako například interfejs Spliterator, který je vlastně jedním ze základních stavebních prvků datovodů. 1.1 Vymezení tématu práce a důvod výběru tématu Práce se zabývá novými možnostmi deklarativního programování s pomocí nových prvků převzatých z domény funkcionálních programovacích jazyků lambda-výrazů, odkazů na metody a datovodů. Toto téma jsem si vybral, protože mě oblast programování zajímá a je i vhodné vzhledem k mému zaměstnání vývojáře pro rozšíření znalostí. 1.2 Cíle práce Jednou z významných motivací nové verze jazyka Java bylo umožnění jednoduššího paralelního zpracování tím způsobem, že uživatel bude odstíněn od nutnosti imperativní implementace a bude mu nabídnuta mnohem pohodlnější deklarativní cesta. Ačkoli primární motivací je využití paralelního zpracování, lze datovody využívat i pro sériové zpracování. S datovody je možné pracovat v deklarativním stylu velmi podobném například databázovému dotazovacímu jazyku SQL. Hlavními cíli práce bude: 1. Podrobně popsat fungování nových prvků převzatých z domény funkcionálních programovacích jazyků konstrukce umožňující pracovat s funkcí jako hodnotou v podobě lambda-výrazů a odkazů na metody a konstrukcí známých ve funkcionálních programovacích jazycích jako seznamy s odloženým vyhodnocením v podobě datovodů. 2. Na příkladech demonstrovat použití výše uvedených konstrukcí.

11 1 Úvod 2 3. Ukázat, jak navrhnout vlastní řešení v případech, kdy výchozí nelze použít. 1.3 Způsob/metoda dosažení cíle Pro dosažení cíle budu používat zejména odborných zdrojů, ke kterým bude primárně patřit dokumentace společnosti Oracle vlastníka jazyka Java. Nejprve budou nastíněny základní koncepty funkcionálního programování, poté bude následovat popis adopce těchto prvků jazykem Java a na konci práce bude ukázáno, jak navrhnout a implementovat vlastní rozšíření. 1.4 Struktura práce Práce je rozdělena na část teoretickou a praktickou. Teoretická část je pokryta kapitolami 3-8. Teoretická část hovoří o motivaci zavedení nových prvků, popisuje funkcionální programování a jeho základní principy, poté ukazuje principy nově zavedených prvků a končí popisem balíčku java.util.stream. Praktická část je pokryta kapitolami 9 a 10. V praktické části jsou popsány operace datovodů a navržena vlastní řešení. 1.5 Výstupy práce a očekávané přínosy Přínos práce bude spočívat zejména v popisu nových konstrukcí a návrhu vlastních řešení. S ohledem na významně menší množství české literatury v této oblasti oproti anglické, může být tato práce přínosná zejména pro českého čtenáře, avšak čtenáře alespoň mírně pokročilého v oboru informačních technologií může jít například o studenty zajímající se o danou oblast a/nebo píšící závěrečnou práci na související téma, vývojáře nebo jiné osoby se zájmem v této oblasti.

12 2 Rešerše zdrojů 3 2 Rešerše zdrojů Předmětnou oblast pokrývá široké spektrum zdrojů od oficiální dokumentace po nejrůznější vývojářské weby a blogy. Naprostá většina literatury je v anglickém jazyce. Jako primární zdroj byl použit Java Language Specification: Java SE 8 Edition [1]. Jde o kompletní technickou příručku pro programovací jazyk Java. Kniha poskytuje úplný, detailní a přesný popis prvků jazyka. Nejvíce bylo čerpáno z kapitol popisujících nové prvky přidané do osmé verze, tj. lambda-výrazy, odkazy na metody, implicitní metody atd. Dalším z důležitých zdrojů použitých v této práci byla dokumentace API Javy 8 [2]. V dokumentaci nalezneme popis balíčků, tříd, interfejsů, metod atd. V řadě případů ale dokumentace poskytuje vysvětlení, které je vhodné doplnit další literaturou. Z tohoto zdroje byla nejvíce použita část popisující balíček java.util.stream. Jako třetí zdroj byla použita kniha Java 8 in Action: Lambdas, Streams and functional-style programming [3]. Jedná se o velmi srozumitelně napsaného průvodce popisujícího a vysvětlujícího nové prvky Javy 8 s důrazem na prvky převzaté z domény funkcionálních programovacích jazyků. Výhodou této knihy je, že se nazastavuje pouze na úrovni kódu, ale snaží se na celou oblast nahlížet z vyšší perspektivy. Další silnou stránkou je, že výklad průběžně ilustruje na příkladech, aby bylo pro čtenáře jednodušší získané teoretické znalosti převést na praktickou úroveň. Kniha byla velmi vhodná pro pochopení některých skutečností, které nebyly (a ze své podstaty ani být nemohly) v prvních dvou uvedených zdrojích vysvětleny. Tento zdroj posloužil pro pochopení základních principů funkcionálního programování, nových prvků funkcionálního programování adoptovaných novou verzí Javy a jako inspirace pro příklady použité v této práci. Dalším zdrojem byla publikace Rudolfa Pecinovského Java 8: Úvod do objektové architektury pro mírně pokročilé [4], která se dobře doplňovala s výše uvedenými publikacemi a byla jedním z mála použitých zdrojů v českém jazyce. Výhodou této knihy je, že nahlíží na jazyk Java z jiné perspektivy než ostatní, čímž čtenáři pomáhá uvědomit si řadu skutečností, které jiné zdroje ignorují. Poslední skupinou zdrojů byly ostatní zdroje internetu, z kterých lze jmenovat například web vývojářských profesionálů nabízející nepřeberné množství teoretických i praktických znalostí z oblasti informačních technologií.

13 3 Motivace změn v Javě Motivace změn v Javě 8 Vše podléhá vývoji, programovací jazyky nevyjímaje. Hybné síly v našem případě můžeme zjednodušeně rozdělit do čtyř skupin: 1. business část společnosti 2. programátoři 3. úroveň technologie 4. světonázor Požadavky business části společnosti lze v dnešní době charakterizovat velkým objemem dat, rychlostí a kvalitou jejich zpracování, požadavky programátorů pohodlností práce s kódem, třetí skupina určuje, co je a co není možné, a poslední ovlivňuje způsob řešení všeho předchozího. V tomto modelu se prvky vzájemně systémově ovlivňují a vytváří třecí plochy, které působí na vývoj programovacích jazyků. Co bylo třecími plochami při přechodu od Javy 7 k Javě 8? Následující čtyři body odpovídají výše uvedeným. 1. Ve své bakalářské práci jsem se dotkl otázky růstu objemu dat. Mimo jiné jsem citoval zdroj [5], který toto názorně ilustroval následujícím způsobem: v roce 2011 má být vytvořeno a replikováno neuvěřitelných 1,8 zetabajtů dat. Takové množství by například vytvořili obyvatelé Spojených států, kdyby po dobu let zveřejnili každou minutu 3 příspěvky v síti Twitter. Odpovídá to také více než 200 miliardám filmů ve vysokém rozlišení (každý o délce dvě hodiny). Zhlédnutí by jednomu člověku při nepřetržitém sledování trvalo 47 milionů let. 1,8 zetabajtů je také množství informací, které by naplnilo 57,5 miliardy tabletů Apple ipad s kapacitou 32 GB. Z nich by pak šla postavit Velká čínská ipadová zeď s dvojnásobnou průměrnou výškou oproti té původní, nebo postavit 6 metrů vysokou zeď lemující Jižní Ameriku Je tedy neustále třeba zpracovávat stále větší a větší objemy dat s tímto trendem se pojí termín Big Data. 2. Data jsou ukládána do datových struktur, prostřednictvím kterých se s nimi provádí nejrůznější operace. Dle [3] jsou nejvíce používanými datovými strukturami Javy kolekce. 3. Dle [4] roste v dnešní době výkonnost počítačů hlavně růstem počtu procesorů. 4. V oblasti programování lze sledovat jednoznačný trend, který posouvá imperativní pohled směrem k pohledu deklarativnímu. Existuje tedy požadavek zpracovávání velkého množství dat ve velké rychlosti a kvalitě. Jsou k dispozici datové struktury, které programátoři pro tento účel nejčastěji používají. Existují technologické aspekty, které vedou ke zvyšování výkonu počítačů zejména

14 3 Motivace změn v Javě 8 5 prostřednictvím růstu počtu procesorů. V neposlední řadě se projevuje i obecný trend ve vývoji programovacích jazyků jdoucí deklarativním směrem. Vše výše jmenované vede k následujícímu: Práce s kolekcemi v Javě 7 se stává pro takový objem dat velmi pracnou a nepohodlnou záležitostí. Výkon počítačů je zvyšován zejména růstem počtu procesorů. Je tedy nutné zamyslet se nad možností využití vícejádrové architektury použitím paralelního zpracování. Programování vícevláknových aplikací je velmi náročné, takže v této oblasti je tím spíše nutné zavést takový styl, který by programátora zcela odstínil od nutnosti rozdělit zpracování programu mezi více vláken. V neposlední řadě působí všeobecný trend, který posouvá programovací jazyky od otázky způsobu řešení k otázce předmětu řešení. Pokud měla Java zůstat nadále použitelným jazykem, bylo nutné na systémové změny zareagovat. Jednou z těchto reakcí je právě převzetí prvků funkcionálního programování. Následující kód je zapsán v Javě 7. * Metoda přijme seznam instancí typu Person - osob a vrátí nový seznam * instancí typu String - křestní jména osob mladších třiceti let. * Metoda je napsána bez pomoci datovodů. public static List<String> youngpeoplenamesold(list<person> list) { List<Person> youngpeople = new ArrayList<>(); for (Person p : list) { if (p.getage() < 30) { youngpeople.add(p); Collections.sort(youngPeople, new Comparator<Person>() public int compare(person p1, Person p2) { return Integer.compare(p1.getAge(), p2.getage()); ); List<String> youngpeoplenames = new ArrayList<>(); for (Person p : youngpeople) { youngpeoplenames.add(p.getname()); return youngpeoplenames; Tento kód je zapsán pomocí nových konstrukcí Javy 8. * Metoda přijme seznam instancí typu Person - osob a vrátí nový seznam * instancí typu String - křestní jména osob mladších třiceti let.

15 3 Motivace změn v Javě 8 6 * V této metodě se používají datovody. public static List<String> youngpeoplenamesadvanced(list<person> list) { List<String> youngpeoplenames = list.stream().filter(p -> p.getage() < 30).sorted(comparing(Person::getAge)).map(Person::getName).collect(Collectors.toList()); return youngpeoplenames; Kód zapsaný za použití nových konstrukcí Javy 8 je stručnější, přehlednější a jeho zápis odpovídá deklarativnímu konceptu.

16 4 Funkcionální programování 7 4 Funkcionální programování Funkcionální programování je specifický programovací pohled pracující s výpočty prostřednictvím matematických funkcí. Funkcionální programovací jazyky odpovídají deklarativnímu paradigmatu, tj. jsou založeny na myšlence programování aplikací pomocí definic, co se má udělat, namísto jak se to má udělat. [3] Základem funkcionálních programovacích jazyků je zápis programu ve tvaru výrazů, jejichž nejdůležitějšími složkami jsou funkce a jejich parametry. Výpočet probíhá v podobě zjednodušování výrazu až do tzv. normální formy, tj. takového stavu, kdy výraz již dále zjednodušit nelze. Tento tvar je výsledkem výpočtu. Řada funkcionálních programovacích jazyků vychází z λ-kalkulu. [6] 4.1 λ-kalkul λ-kalkul (nebo také lambda-kalkul) je systém využívaný matematikou a teoretickou informatikou ke studiu funkcí a rekurze. Byl vytvořen Alonzo Churchem ve spolupráci se Stephenem Colem Kleenem. Jeho první verze pochází z 30. let 20. století. V roce 1936 Church oddělil a publikoval samostatnou pro informatiku podstatnou část, která se nazývá netypovým lambda-kalkulem. Na přelomu 50. a 60. let 20. století začal být používán v informatice ke studiu vyčíslitelnosti a formálních jazyků. Stal se teoretickým základem řady funkcionálních programovacích jazyků. [6] Na rozdíl od matematického přístupu ke zkoumání funkcí, tj. ve smyslu přiřazování číslu x z množiny čísel (většinou reálných nebo komplexních) A právě jednoho čísla y z množiny čísel B podle konkrétního předpisu, nahlíží lambda-kalkul na funkce jako na metodu výpočtu. Lze jej chápat jako jednoduchý univerzální programovací jazyk. [6] Řecké písmeno lambda (λ) označuje parametry funkce. Church se inspiroval značením volných proměnných v díle Principia Mathematica, kde se značily symbolem ˆ (stříška, cirkumflex). Church se na základě toho rozhodl značit parametry velkým písmenem lambda Λ, ale poté přešel k malému písmenu lambda. [7] Na základě důležitosti pojmů vázaných proměnných a substituce se rozlišuje netypový a typový lambda-kalkul. Z historického hlediska je důležitější lambda-kalkul netypový, ve kterém nejsou aplikace funkcí nijak omezené. Typový lambda-kalkul je variací, která aplikace funkcí omezuje v tom smyslu, že mohou být aplikovány pouze v případě, že jsou schopny přijmout vstupní typ dat. [6] Základní prvky lambda-kalkulu se nazývají lambda-výrazy. Vyskytují se ve třech podobách: [6]

17 4 Funkcionální programování 8 Proměnné jak jsou definovány v matematice (x, y, ) Abstrakce definice funkce, např. funkce zapsaná matematicky ƒ(x) = x + 1, se zapíše v lambda-kalkulu jako λx. x + 1, tj. mezi λ a tečkou se nachází parametry funkce, za tečkou tělo funkce. Aplikace volání funkce, v matematice se funkce zavolá např. s parametrem 9 takto: ƒ(9), v lambda-kalkulu jsou volány takto: (λx. x + 1) 9. Lambda-výraz lze rekurzivně vyjádřit následujícím způsobem: [8] výraz = proměnná abstrakce aplikace abstrakce = λ proměnná. výraz aplikace = výraz výraz Výše bylo zmíněno, že písmeno lambda označuje parametry funkce vázanou proměnnou. Oproti tomu existují i volné proměnné. Rozdíl mezi nimi je ukázán na následujícím příkladu. Je dána funkce ƒ(x) = x + y, která se v lambda-kalkulu zapíše jako λx. x + y. Proměnná x je v tomto případě vázaná, proměnná y volná. Proměnná je tedy v lambda-výrazu vázaná, pokud je parametrem nějaké funkce. Proměnná se vždy váže na nejbližší lambdu směrem doleva. Rozlišování volných a vázaných proměnných je důležité při provádění operací s výrazy. [6] V lambda-kalkulu má funkce vždy jenom jeden parametr. Pokud nastane situace, kdy je třeba mít funkci s více parametry, využije se tzv. curryingu [3]. Do češtiny zde budu tento výraz překládat jako curryifikace. Jde o techniku, kdy je funkce o více parametrech transformována na sekvenci funkcí, kdy každá přijímá jeden parametr. Funkci ƒ(x, y) = x + y, lze přepsat na lambda-výraz λx. λy. x + y. Při aplikaci hodnot, např. 1 a 2, bude vyhodnocení probíhat následujícím způsobem: [6] (λx. λy. x + y) 1 2 -> (λx = 2. λy. x + y) 1 -> (λy. 2 + y) 1 -> λy = y -> > 3.

18 4 Funkcionální programování Redukce a konverze Základní operace v lambda-kalkulu jsou redukce a konverze. Jejich prostřednictvím lze lambda-výrazy upravovat. Existují tři základní operace: α-konverze (alfa), β-redukce (beta) a η-redukce (éta). [6] α-konverze umožňuje přejmenování vázaných proměnných jedná se tedy v podstatě o substituci. V tomto případě je však třeba dbát na to, aby se při úpravě výrazu nezměnila některá z volných proměnných v proměnnou vázanou. Je definován následující lambda-výraz: λx. x + 1 Tento výraz lze uplatněním alfa-konverze upravit například na Pokud ale bude definován výraz pak nelze provést λy. y + 1. λx. x + y, λy. y + y, protože by se volná proměnná stala vázanou, a tím se změnil význam výrazu. Výrazy, které se liší pouze v α-konverzi, nazýváme α-ekvivalentní. [6] β-redukce je spojena s aplikací funkce. Konkrétně jde o substituci parametru volané funkce hodnotou. Použití je ukázáno na následujícím příkladu: (λx. x + 1) 9 -> (λx = 9. x + 1) -> > 10 Jakýkoliv lambda-výraz může být považován za hodnotu, a tedy aplikován na jiný lambda-výraz. Lze tedy napsat: [6] (λx. x + 1) (λy. y + 2) -> (λx = (λy. y + 2). x + 1) -> ((λy. y + 2) + 1) η-redukce se zabývá ekvivalencí funkcí. Říká, že dvě funkce jsou si rovny tehdy, a pouze tehdy, pokud vrací stejný výsledek pro všechny parametry. Následující příklad ukáže, jak tato konverze funguje. Je definován výraz λx. ((A) x),

19 4 Funkcionální programování 10 kde A označuje libovolný lambda-výraz. Celý výraz po aplikaci hodnoty lze zapsat jako což lze upravit na z čehož plyne, že (λx. ((A) x)) hodnota, (λx = hodnota. ((A) x))), neboli (A) hodnota, λx. ((A) x) = A. Výraz, který lze měnit s použitím některé z předchozích konverzí, se nazývá redex (reducible expression). Dle konverzí / redukcí se rozlišuje α, β nebo η-redex. [6] Zásadní myšlenkou lambda-kalkulu, který poté přebírají funkcionální programovací jazyky, je to, že pracuje s funkcí jako s hodnotou. Z toho mimo jiné vyplývá i to, že funkci lze předat jako parametr jiné funkci nebo vrátit funkci jako výsledek. 4.2 Charakteristické prvky funkcionálních programovacích jazyků Charakteristickým prvkům funkcionálních programovacích jazyků se ve své bakalářské práci [9] věnuje Igor Bobuský. Ve stručnosti je zde zopakováno, o jaké prvky se jedná Funkce jako entity první úrovně Jak bylo zmíněno na konci podkapitoly věnované lambda-kalkulu, funkcionální programovací jazyky přebírají z tohoto matematického systému koncept funkce jako hodnoty. Hodnotu lze uložit do proměnné, předávat jako parametr funkci, vracet jako výsledek funkce nebo uložit do datové struktury. Entity splňující předchozí kritéria se v anglickém jazyce nazývají first-class values nebo first-class citizens [3]. Do češtiny budu tyto výrazy překládat jako entity první úrovně a funkce první úrovně. Možnost pracovat s funkcí jako entitou první úrovně dodává psaní programů značnou flexibilitu Funkce vyššího řádu Jde o takové funkce, které jsou schopny provést alespoň jednu z následujících operací: [3] přijmout jednu nebo více funkcí jako parametr vrátit funkci jako výsledek

20 4 Funkcionální programování 11 V anglickém jazyce se tyto funkce nazývají higher-order functions [3]. V českém jazyce budu pro tyto funkce používat název funkce vyššího řádu. Funkce vyššího řádu umožňují zjednodušení kódu abstrahováním opakující se funkcionality. [3] Odkazová transparentnost Tento princip souvisí s předchozím. V programování je odkazově transparentní takový výraz, který může být nahrazen svou hodnotou, aniž by to ovlivnilo chování programu [3]. Aplikováním tohoto přístupu na funkce lze volně zaměňovat volání funkce a vrácenou hodnotu. V anglickém jazyce je tento princip nazýván referential transparency [3]. V českém jazyce budu pro tento princip používat termín odkazová transparentnost. Tento princip je výhodný při optimalizaci provádění programu Neměnnost stavů Tento princip souvisí s předchozím. Čisté funkcionální programovací jazyky používají struktury, jejichž stav se nemění. Pokud by totiž byla umožněna změna struktur, závisel by výsledek funkce na čase, kdy by byla zavolána. Funkce by pak nemohla být odkazově transparentní. V anglickém jazce se používá výraz immutability. Do češtiny se překládá jako nemměnost [4]. Tento princip je výhodný při práci s vlákny Odložené vyhodnocení Jde o princip vyhodnocování výrazů až v okamžiku, kdy je jejich výsledek potřeba [3]. Neměnnost stavů dále umožňuje princip, který se v anglickém jazyce nazývá lazy-evaluation, který se do česekého jazyka překládá jako odložené vyhodnocení [4]. Výhodou je například možnost používání nekonečných datových struktur Absence vedlejších efektů Úlohou matematické funkce, dá-li se to takto vyjádřit, je přijmout jeden nebo více parametrů a vrátit výsledek, přičemž pro stejné parametry vrací vždy stejný výsledek. V programování se vedlejším efektem rozumí situace, kdy je provedena akce, která není zcela izolována v rámci dané funkce. Vedlejší efekty má funkce, která kromě vrácení výsledku přistupuje a mění globální proměnné, mění své vstupní parametry nebo má interakci s okolním prostředím může jít například o výpis na konzoli, čtení nebo zápis do souboru, vyhození výjimky nebo ukládání do databáze [30]. V angličtině se používá termín side-effect [3] který do češtiny překládáme jako vedlejší efekt [4]. Absence vedlejších efektů významným způsobem usnadňuje práci s vlákny.

21 4 Funkcionální programování Deklarativní způsob programování Deklarativní způsob programování byl vysvětlen na začátku kapitoly. Jde o takový způsob programování, který se zaměřuje ne na způsob, ale na předmět řešení. Odpovídá na otázku, čeho má být dosaženo. Funkcionální programovací jazyky umožňují pracovat na vyšší úrovni abstrakce než imperativní a jsou více modulární. Opakující se funkcionalitu lze abstrahovat použitím funkcí vyššího řádu, čímž lze docílit kódu, který je srozumitelnější a více deklarativní. [3]

22 5 Funkcionální prvky v Javě Funkcionální prvky v Javě 8 Funkcionální prvky v Javě 8 lze zjednodušeně rozdělit na dvě části. První se týká principu funkce jako hodnoty, druhý specifické datové struktury, která obsahuje prvky vytvořené pouze na požádání. 5.1 Funkce jako hodnota Tento prvek je novinkou Javy 8. V předchozích verzích Javy bylo třeba pro daný účel potřeba vytvořit třídu, jejíž instance funkci zabalila. Mohlo se jednat o instance klasických i anonymních tříd [4] anglicky anonymous class [1]. Funkci jako hodnotu můžeme nově předávat prostřednictvím lambda-výrazu nebo odkazu na metodu. Tyto konstrukce se v angličtině nazývají jako lambda-expressions a method references [1]. Jde o druh konstrukce, který se v anglickém jazyce nazývá syntactic sugar [3], v češtině se používá výraz syntaktický cukr. Překladač sice novou konstrukci převede na objekt, ale syntakticky se jeví jako funkce. Jedná se tedy pouze o zjednodušenou formu zápisu, ale tato zjednodušená forma velmi výrazně zpřehledňuje kód a usnadňuje jeho psaní Lambda-výrazy Lambda-výrazy jsou specifické konstrukce, které se použijí v situacích, kdy je třeba předat funkci jako hodnotu. Následující kód ukazuje stejnou funkcionalitu implementovanou za pomoci anonymní třídy a lambda-výrazu. * Anonymní třída implementuje funkční rozhraní IntFunction. Překrytá * metoda apply() přičte ke vstupnímu parametru hodnotu 1. public static IntFunction<Integer> fnc = new IntFunction<Integer>() public Integer apply(int x) { return x + 1; ; * Lambda-výraz implementuje funkční rozhraní IntFunction. Uložená funkce * přičte ke vstupnímu parametru hodnotu 1. public static IntFunction<Integer> fncadvanced = x -> x + 1;

23 5 Funkcionální prvky v Javě 8 14 Kód při použití lambda-výrazu je kratší a přehlednější. Odkazování na metody Může se stát, že požadovaná metoda je již k dispozici a je třeba ji pouze předat jako hodnotu. V těchto případech lze použít odkaz na metodu. Metoda přičítající hodnotu 1 ke vstupnímu parametru je například již deklarovaná např. ve třídě Vypocet. *************************************************************************** * Třída Vypocet obsahuje jedinou metodu prictijedna(). * Tato třída slouží k demonstraci odkazování na metodu. public class Vypocet { // Metoda přičítá ke vstupnímu parametru hodnotu 1. public static int prictijedna(int x) { return x + 1; Nyní následuje ukázka implementace pomocí anonymní třídy a odkazu na metodu. // Odkaz na metodu přičítající ke vstupnímu parametru hodnotu 1. public static IntFunction<Integer> fncreference = Vypocet::prictiJedna; Předchozí odkaz na metodu lze lambda-výrazem vyjádřit následujícím způsobem. // existující metodu lze vyjádřit lambda-výrazem public static IntFunction<Integer> fnc = x -> Vypocet.prictiJedna(x); Každý odkaz na metodu lze vyjádřit lambda-výrazem, ale ne každý lambda-výraz odkazem na metodu (metoda musí již existovat). 5.2 Seznam s odloženým vyhodnocením Seznam s odloženým vyhodnocením je charakteristickým prvkem funkcionálních programovacích jazyků. Jde o takovou datovou strukturu, která tvoří své prvky pouze na požádání. Důsledkem je, že může obsahovat nekonečnou sekvenci prvků. Anglický název pro tuto datovou strukturu je lazy-list [3]. Do češtiny budu tento termín překládat jako seznam s odloženým vyhodnocením.

24 5 Funkcionální prvky v Javě Datovody Líné seznamy jsou v Javě 8 implementovány v podobě datovodů. Tento nový prvek ve spojení s výše popsanými lambda-výrazy a odkazy na metody umožňuje pracovat s daty výrazně snadnějším způsobem, než tomu bylo v předchozí verzi Javy. Na následujícím příkladu je ukázán kód zapsaný pomocí konstrukcí Javy 7 a 8. * Metoda přijímá seznam celých čísel a vypisuje čísla sudá. Metoda je * napsána bez pomoci datovodů. public static void printevennumbersold(list<integer> intlist) { for (int i : intlist) { if (i % 2 == 0) { System.out.println(i + " is even"); * Metoda přijímá seznam celých čísel a vypisuje čísla sudá. Metoda je * napsána s pomocí datovodů. public static void printevennumbersadvanced(list<integer> intlist) { intlist.stream().filter(i -> (i % 2 == 0)).forEach(i -> System.out.println(i + " is even")); V kódu Javy 8 není nutné se explicitně starat o procházení prvků a kód je více deklarativní.

25 6 Lambda-výrazy (a odkazy na metody) 16 6 Lambda-výrazy (a odkazy na metody) Je paradoxem, že se Java dočkala lambda-výrazů až s poslední verzí JDK 1.8, když některé populární programovací jazyky, a to nejen tradiční funkcionální jako Lisp nebo Scheme, je používaly již dávno předtím. Jedná se například o jazyky JavaScript, Python, Ruby, Groovy, Scala nebo C#. Tím spíše, že některé z nich běží na Java Virtual Machine. [10] O zařazení lambda-výrazů do Javy se začalo diskutovat již v roce 2006 po vydání JDK 1.5, ale nehledě na racionální argumenty k realizaci nedošlo. Myšlenka utonula v diskusích o budoucích směrech vývoje jazyka. V roce 2009 uvázla otázka na mrtvém bodě a zdálo se, že se Java lambda-výrazů nakonec nedočká. Naštěstí se v roce 2010 v Oracle rozhodli, že svůj jazyk nepohřbí, ale bude ho nadále podporovat jako populární široce používaný jazyk. [10] K dosažení tohoto cíle je třeba reagovat na tendence vývoje na poli informačních technologií, a to konkrétně multiprocesorového hardware. V dnešní době totiž ke zvyšování výkonu počítačů dochází spíše cestou kvantitativní než kvalitativní, tj. zvyšováním počtu procesorů [4]. Pro efektivní využití vícejádrové architektury je třeba operace zpracovávat paralelně. Aby mohl jazyk udržet krok s moderním trendem, bylo jasné, že knihovna kolekcí musí podstoupit výrazné změny. [10] Pro úspěšnou implementaci funkcí zpracovávající velké objemy dat paralelně je nezbytná jakási reorganizace odpovědností. Pokud by se měl programátor starat o to, jak má algoritmus fungovat, stál by před velmi nelehkým úkolem. Pro zjednodušení práce je třeba ustoupit od pohledu jak k pohledu co. Je tedy třeba provést posun od přístupu imperativního k přístupu deklarativnímu. Jedním z prvků, který tento přesun v nové verzi jazyka Java umožňuje, jsou právě lambda-výrazy. 6.1 Funkční interfejs Anglickým výrazem interface se v Javě rozumí specifická jazyková konstrukce podporující vytváření abstraktní vrstvy mezi konkrétními implementacemi a programy, které je používají. Do češtiny budu v souladu s [4] překládat tento termín jako interfejs. Functional interface [1] neboli funkční interfejs není novinkou Javy 8. S touto konstrukcí bylo možné se setkat již v předchozích verzích Javy. Jde například o interfejs Runnable, ActionListener, Comparator atd., tedy interfejs deklarující jedinou abstraktní metodu. S adopcí prvků funkcionálního programování se však začíná hovořit o funkčních interfejsech

26 6 Lambda-výrazy (a odkazy na metody) 17 a Java 8 pro ně zavádí Funkční interfejs je zajímavý, protože jej lze implementovat lambda-výrazem nebo odkazem na metodu. [1] Tvůrci jazyka se rozhodli nezavádět speciální datový typ jako v jiných jazycích (např. C#.NET). Místo toho se rozhodli, že se použije interfejs. V předchozích verzích Javy bylo třeba pro implementaci takového interfejsu použít pojmenovanou nebo anonymní třídu, která je ve srovnání s lambda-výrazem nebo odkazem na metodu mnohem upovídanější. Pro vytvoření instance funkčního interfejsu pomocí lambda-výrazu nebo odkazu na metodu, bude třeba znát jeho abstraktní metodu. Například funkční interfejs Function<T,R> deklaruje abstraktní metodu R apply(t t). Protože jde o funkční interfejs, lze jeho instanci vytvořit prostřednictvím lambda-výrazu nebo odkazu na metodu. Abstraktní metoda přijímá parametr typu T, a vrací výsledek typu R. Lze tedy napsat něco takového: [1] * Lambda-výraz implementuje funkční rozhraní Function. Definovaná funkce * umocní vstupní parametr typu Integer na druhou. Function<Integer, Integer> square = i -> i * i; * Lambda-výraz implementuje funkční rozhraní Function. Definovaná funkce * převede vstupní text typu String na text s velkými písmeny. Function<String, String> uppercase = s -> s.touppercase(); 6.2 Syntaxe lambda-výrazů Lambda-výrazy se v Javě zapisují s pomocí šipky ->. Vlevo od šipky se nachází parametry, vpravo tělo funkce. Zde jsou některé příklady zápisu lambda-výrazů [1]. V případě že metoda nemá parametry, zapisují se kulaté prázdné závorky. // lambda-výraz bez parametrů s návratovou hodnotou void () -> System.out.println("Hello, world."); Pokud má metoda parametr, jehož typ je schopen překladač odvodit z kontextu, není nutné typ explicitně uvádět. Pokud je parametr pouze jeden, lze vynechat kulaté závorky. // lambda výraz s jedním parametrem s návratovou hodnotou void e -> System.out.println(e); Metoda může mít pochopitelně více parametrů. V některých případech není překladač schopen z kontextu zjistit typ parametru, a tak je nutní jej explicitně uvést. V případě, že je v těle potřeba uvést více příkazů, použije se zápis v bloku se složenými závorkami.

27 6 Lambda-výrazy (a odkazy na metody) 18 // lambda-výraz se dvěma parametry s tělem zapsaným v bloku (String first, String second) -> { if (first.length() < second.length()) return -1; else if (first.length() > second.length()) return 1; else return 0; 6.3 Odkazování na metody Lambda-výrazy pomáhají vytvářet anonymní metody. Někdy ale pouze volají nějakou již existující metodu. V těchto případech lze použít tzv. odkaz na metodu. [1] Odkaz na metodu zapisujeme za použití operátoru :: následujícím způsobem: // statická metoda nebo metoda instance SomeClass::someMethod // metoda instance someinstance::somemethod // konstruktor třídy someclass SomeClass::new V prvním případě se jedná o metodu somemethod() definovanou ve třídě SomeClass. Může jít o statickou i instanční metodu. V případě instanční metody je třeba v prvním parametru uvést instanci dosazovanou za this. Ve druhém výrazu je odkaz na metodu somemethod() instance someinstance a v poslední ukázce na konstruktor třídy SomeClass [4]. Pokud jsou metody přetížené, překladač si vybere správnou verzi. V následujícím příkladu se filtrují všechny osoby s vysokoškolským vzděláním. * Metoda testovací třídy PrikladyTest vytváří testovací seznam * uživatelů. public List<Person> createlistofpeople() { Person p1 = new Person("Jan", "Novák", 35, "Praha", PRIMARY_SCHOOL); Person p2 = new Person("Jiří", "Novotný", 29, "Brno", HIGH_SCHOOL); Person p3 = new Person("Martin", "Kovář", 25, "Olomouc", UNIVERSITY); Person p4 = new Person("Petr", "Kováč", 31, "Plzeň", UNIVERSITY); List<Person> people = new ArrayList(); people.add(p1); people.add(p2); people.add(p3);

28 6 Lambda-výrazy (a odkazy na metody) 19 people.add(p4); return people; Zde je metoda pro filtrování. * Metoda přijímá seznam instancí typu Person - osoby a instanci typu * IPersonPredicate a vrací seznam instancí třídy Person - osoby splňující * daný predikát. public static List<Person> filterpeople(list<person> list, IPersonPredicate p) { List<Person> result = new ArrayList<>(); for (Person person : list) { if (p.test(person)) { result.add(person); return result; Metoda se testuje public void testfilterpeople() { List<Person> people = createlistofpeople(); List<Person> result = Priklady.filterPeople(people, p -> p.iseducated()); asserttrue(result.size() == 2); Lambda-výraz použitý v testu ale nedělá nic jiného, než že definuje příkaz, který metodu iseducated() zavolá, až někdo ve volané metodě předávaný lambda-výraz aktivuje. Lze jej tedy přepsat s pomocí odkazu na metodu takto: ArrayList<Person> educatedpeople = filterpeople(list, Person::isEducated); V některých případech může být zápis při použití odkazu na metodu přehlednější.

29 6 Lambda-výrazy (a odkazy na metody) Od parametrizace hodnot k lambdám Tato podkapitola bude věnována praktické ukázce užitečnosti konstrukcí umožňujících předávat funkci jako hodnotu. Je předloženo zadání na následující implementaci. Personální oddělení společnosti žádá o dodávku systému, který by kromě jiného poskytoval řešení filtrování osob podle zadaných kritérií, přičemž osoby musí být možné filtrovat i podle více kritérií zároveň, tj. například podle vzdělání, věku atd. První pokus Na první pohled se jedná o triviální záležitost. Lze začít například s implementací, která umožní filtrovat osoby podle vzdělání. Kód by mohl vypadat následovně: * Metoda přijímá seznam instancí typu Person - osoby a vrací seznam * instancí typu Person - osoby splňující pevně nastavenou podmínku * vzdělání. public static List<Person> educatedpeople(list<person> list) { ArrayList<Person> result = new ArrayList<>(); for (Person person : list) { if (person.geteducation().equals(university)) { result.add(person); return result; Po pozornějším prohlédnutí je ale vidět, že řešení je poměrně nešikovné. Metoda má pouze jeden parametr a v těle metody je pevně nastavena konkrétní hodnota vzdělání. Pro nalezení zaměstnance s jiným vzděláním by bylo třeba mít podobnou metodu pro každou hodnotu vzdělání. Jeden ze základních principů programování říká, že bezdůvodné opakování kódu je chybou [4]. Pro návrh dobrého kódu je třeba se řídit principem DRY (Don t Repeat Yourself). Je tedy nutné najít lepší řešení. Druhý pokus Metodu lze vylepšit tak, že hodnota nebude zadávána pevně do těla metody, ale bude předávána jako parametr. * Metoda přijímá seznam instancí typu Person - osob a hodnotu výčtového * typu Education - vzdělání a vrací seznam instancí typu Person - osoby

30 6 Lambda-výrazy (a odkazy na metody) 21 ****************************************************************************** * Funkční rozhraní IPersonPredicate se využívá pro parametrizaci chování. * Maxim Rytych * splňující danou podmínku vzdělání. public static ArrayList<Person> personeducation(arraylist<person> list, Education education) { ArrayList<Person> result = new ArrayList<>(); for (Person person : list) { if (person.geteducation().equals(education)) { result.add(person); return result; Kód je nyní generičtější. Druhý parametr umožňuje zadávat požadované vzdělání. Zanikl tedy problém, kvůli kterému bylo nutné mít pro každou úroveň vzdělání samostatnou metodu. Nyní lze přejít k implementaci metody, která bude filtrovat osoby podle dalšího kritéria například věku. * Metoda přijímá seznam instancí typu Person - osob a hodnotu typu * int - věk a vrací seznam typu Person - osoby splňující danou podmínku * věku. public static List<Person> personage(list<person> list, int age) { ArrayList<Person> result = new ArrayList<>(); for (Person person : list) { if (person.getage() < age) { result.add(person); return result; Do metody pro filtrování podle věku byl stejně jako v předchozí metodě přidán parametr, který umožňuje zadat požadovaný věk. Zbytečnému opakování kódu se tedy lze vyhnout vhodnou parametrizací. Třetí pokus Zvyšování počtu parametrů a/nebo metod ale také není zcela optimálním řešením. Je třeba provést vhodnou abstrakci, která umožní pohlédnout na řešený problém z nového úhlu. Novým řešením může být zavedení interfejsu.

31 6 Lambda-výrazy (a odkazy na metody) public interface IPersonPredicate { boolean test(person person); Interfejs obsahuje jednu abstraktní metodu s návratovou hodnotou typu boolean a jedním parametrem typu Person. Protože má pouze jednu abstraktní metodu, jde o funkční interfejs, který lze označit Interfejs implementují následující třídy. **************************************************************************** * Třída EducatedPeople implementuje funkční interfejs IPersonPredicate. * Třída se využívá pro parametrizaci chování. Obsahuje v sobě "chování" v * podobě metody test(). * Maxim Rytych public class EducatedPeople implements IPersonPredicate { * Metoda test() přijímá instanci typu Person - osobu a vrací hodnotu * typu boolean na základě vyhodnocení podmínky - zda má osoba * vysokoškolské public boolean test(person person) { return person.geteducation().equals(university); ****************************************************************************** * Třída EducatedPeople implementuje funkční interfejs IPersonPredicate. * Třída se využívá pro parametrizaci chování. Obsahuje v sobě "chování" v * podobě metody test(). * Maxim Rytych public class YoungPeople implements IPersonPredicate {

32 6 Lambda-výrazy (a odkazy na metody) 23 Metoda test() přijímá instanci typu Person - osobu a vrací hodnotu * typu boolean na základě vyhodnocení podmínky - zda je osoba mladší * třiceti public boolean test(person person) { return person.getage() < 30; ****************************************************************************** * Třída EducatedPeople implementuje funkční interfejs IPersonPredicate. * Třída se využívá pro parametrizaci chování. Obsahuje v sobě "chování" v * podobě metody test(). * Maxim Rytych public class YoungAndEducatedPeople implements IPersonPredicate { * Metoda test() přijímá instanci typu Person - osobu a vrací hodnotu * typu boolean na základě vyhodnocení podmínky - zda je osoba mladší * třiceti let a má vysokoškolské public boolean test(person person) { return ((person.getage() < 30) && (person.geteducation().equals(university))); První třída slouží pro vyhledávání osob s vysokoškolským vzděláním, druhá pro vyhledávání osob mladší třiceti let. Třetí implementace kombinuje oba případy. Samotnou metodu pro filtrování osob lze upravit následujícím způsobem: * Metoda přijímá seznam instancí typu Person - osoby a instanci typu * IPersonPredicate a vrací seznam instancí třídy Person - osoby splňující * daný predikát. public static List<Person> filterpeople(list<person> list, IPersonPredicate p) { List<Person> result = new ArrayList<>();

33 6 Lambda-výrazy (a odkazy na metody) 24 for (Person person : list) { if (p.test(person)) { result.add(person); return result; Druhý parametr přijme instanci typu IPersonPredicate. V podmínce v těle cyklu for se zavolá metoda test() konkrétní implementace s parametrem typu Person. Na základě vyhodnocení podmínky se přidávají osoby do výsledného seznamu. Metodu lze otestovat následujícím public void testyoungandeducatedpeople() { List<Person> people = createlistofpeople(); List<Person> result = Priklady.filterPeople(people, new YoungAndEducatedPeople()); asserttrue(result.size() == 1); Toto volání do seznamu přidá pouze osoby mladší třiceti let s vysokoškolským vzděláním. Protože je v seznamu pouze jedna taková osoba, test proběhne úspěšně. Obdobně lze volat metodu s dalšími případnými implementacemi interfejsu IPersonPredicate. Oproti předchozím řešením se podařilo dosáhnout významného pokroku. Podařilo se dosáhnout něčeho, co se v angličtině nazývá behavior parameterization [2]. Česky lze tento termín přeložit jako parametrizace chování. Znamená to, že byla oddělena logika samotné metody pro filtrování a chování, které má být metodou realizováno. Nyní lze prostřednictvím tříd implementujících interfejs IPersonPredicate předávat požadované chování, aniž by bylo nutné metodu přepisovat. Nyní je dokonce možné filtrovat i podle více kritérií najednou. Čtvrtý pokus Pokud by se jednalo o chování, které by se mělo používat na více místech, bylo by řešení téměř optimální. Vylepšit by se dalo pouze použitím odkazu na metodu. Pokud by se ale jednalo o ad-hoc použití, bylo by možné návrh optimalizovat použitím anonymní třídy. Anonymní třídy zná jistě přinejmenším každý vývojář, který se někdy zabýval návrhem grafického uživatelského rozhraní. Používají se například pro nastavení chování komponenty např. stisku tlačítka. Jedná se o konstrukce, které umožňují ve stejný

34 6 Lambda-výrazy (a odkazy na metody) 25 moment deklarovat objekt a vytvořit jeho instanci. Podobné konstrukce jsou vhodné, když je třeba implementovat nějakou ad-hoc funkcionalitu. Test lze za pomoci anonymní třídy napsat následujícím public void testyoungandeducatedpeopleviaanonymousclass() { List<Person> people = createlistofpeople(); List<Person> result = Priklady.filterPeople(people, new IPersonPredicate() { public boolean test(person person) { return ((person.getage() < 30) && (person.geteducation().equals(university))); asserttrue(result.size() == 1); Jak je vidět, metodě byla jako druhý parametr předána instance anonymní třídy. Nyní tedy není třeba vytvářet třídu samostatně, ale lze ji vytvořit přímo na místě použití. Pokud by šlo o kód, který by byl použit častěji, lze použít klasickou třídu, jak bylo ukázáno v příkladu nazvaném třetí pokus. Řešení není ale ještě ani v tuto chvíli zcela optimální. Hlavními výhradami bude jistě to, že kód je stále poměrně rozsáhlý. Nevytváří se sice nová třídu samostatně, ale její tělo je stále používáno. Další výhradou je nepřehlednost anonymních tříd. Kód by měl být ze své podstaty čitelný na první pohled, což se o poslední ukázce spíše říci nedá. Existuje ještě jiné řešení, které by kód více zestručnilo a zpřehlednilo? Odpověď je ano. Lze toho dosáhnout použitím nových prvků jazyka Java 8 lambda-výrazů nebo odkazů na metody. Pátý pokus Testovací metodu lze upravit s pomocí lambda-výrazu public void testyoungandeducatedpeoplevialambda() { List<Person> people = createlistofpeople(); List<Person> result = Priklady.filterPeople(people, (Person person) -> ((person.getage() < 30) && (person.geteducation().equals(university)))); asserttrue(result.size() == 1);

35 6 Lambda-výrazy (a odkazy na metody) 26 Aby bylo možné použít odkaz na metodu, je nutné nejprve odpovídající metodu vytvořit. Metoda přijme instanci typu Person - osobu a vrátí hodnotu typu * boolean v závislosti na vyhodnocení podmínky - zda je osoba mladší * třiceti let a má vysokoškolské vzdělání. public static boolean test(person person) { return (person.getage() < 30 && person.geteducation().equals(university)); Testová metoda s odkazem na metodu bude téměř stejná jako předchozí, kde byl použit public void testyoungandeducatedpeopleviamethodreference() { List<Person> people = createlistofpeople(); List<Person> result = Priklady.filterPeople(people, Priklady::test); asserttrue(result.size() == 1); Zápis prostřednictvím odkazu na metodu je sice nejkratší a nejpřehlednější, ale má tu nevýhodu, že metoda musí být již někde implementována. Lambda-výraz může být méně přehledný, ale lze jej implementovat v místě použití. Parametrizace hodnot ukázala, že je schopna jistým způsobem redukovat napsaný kód. Příkladem byla situace, kdy přidáním dalšího parametru do metody pro filtrování osob bylo možné filtrovat všechny možnosti v konkrétní oblasti, tj. bylo například možné vyhledávat osoby podle vzdělání v jedné metodě. Vzápětí se však ukázalo, že toto řešení nestačí. Nebylo totiž jeho použitím možné vyřešit problém se zadáváním více kritérií. Parametrizace hodnot byla nahrazena parametrizací chování, které předchozí problém dovolilo řešit. Od parametrizace chování se vlastně řešilo předávání metod jako parametru, ačkoli to nebylo takto explicitně vyjádřeno. Protože nešlo vytvořit instanci přímo, bylo nutné ji zabalit do nějakého objektu. Jako první řešení byl použit interfejs a metody byly předávány prostřednictvím tříd implementujících tento interfejs. Toto řešení bylo poté nahrazeno anonymními třídami, které umožnily zbavit se samostatných implementací, takže šlo třídu s metodou deklarovat přímo v místě použití.

Lambda funkce Novinky v interfaces Streamy Optional - aneb zbavujeme se null. Java 8. Ondřej Hrstka

Lambda funkce Novinky v interfaces Streamy Optional - aneb zbavujeme se null. Java 8. Ondřej Hrstka Java 8 Ondřej Hrstka Katedra počítačů Fakulta elektrotechnická České vysoké učení technické v Praze Přednáška 13 A0B36PR2 Programování 2 Ondřej Hrstka, 2015 A0B36PR2 Přednáška 13: Java 8 1 / 26 Obsah Lambda

Více

Stream API. Petr Krajča. Základy programovaní 4 (Java) Katedra informatiky Univerzita Palackého v Olomouci

Stream API. Petr Krajča. Základy programovaní 4 (Java) Katedra informatiky Univerzita Palackého v Olomouci Základy programovaní 4 (Java) Stream API Petr Krajča Katedra informatiky Univerzita Palackého v Olomouci Petr Krajča (UP) KMI/ZP4JV 5. listopad, 2014 1 / 10 Stream API Java 8 nový přístup k práci s kolekcemi

Více

8 Třídy, objekty, metody, předávání argumentů metod

8 Třídy, objekty, metody, předávání argumentů metod 8 Třídy, objekty, metody, předávání argumentů metod Studijní cíl Tento studijní blok má za cíl pokračovat v základních prvcích jazyka Java. Konkrétně bude věnována pozornost třídám a objektům, instančním

Více

14.4.2010. Obsah přednášky 7. Základy programování (IZAPR) Přednáška 7. Parametry metod. Parametry, argumenty. Parametry metod.

14.4.2010. Obsah přednášky 7. Základy programování (IZAPR) Přednáška 7. Parametry metod. Parametry, argumenty. Parametry metod. Základy programování (IZAPR) Přednáška 7 Ing. Michael Bažant, Ph.D. Katedra softwarových technologií Kancelář č. 229, Náměstí Čs. legií Michael.Bazant@upce.cz Obsah přednášky 7 Parametry metod, předávání

Více

Funkcionální programování. Kristýna Kaslová

Funkcionální programování. Kristýna Kaslová Funkcionální programování Kristýna Kaslová Historie Alonzo Church (30. léta) Netypovaný lambda kalkul Základ prvních funkcionálních jazyků Jeho konstrukce i v mnoha současných programovacích jazycích (Python)

Více

PARADIGMATA PROGRAMOVÁNÍ 2 PŘÍSLIBY A LÍNÉ VYHODNOCOVÁNÍ

PARADIGMATA PROGRAMOVÁNÍ 2 PŘÍSLIBY A LÍNÉ VYHODNOCOVÁNÍ KATEDRA INFORMATIKY, PŘÍRODOVĚDECKÁ FAKULTA UNIVERZITA PALACKÉHO, OLOMOUC PARADIGMATA PROGRAMOVÁNÍ 2 PŘÍSLIBY A LÍNÉ VYHODNOCOVÁNÍ Slajdy vytvořili Vilém Vychodil a Jan Konečný (KI, UP Olomouc) PP 2, Lekce

Více

Výčtový typ strana 67

Výčtový typ strana 67 Výčtový typ strana 67 8. Výčtový typ V této kapitole si ukážeme, jak implementovat v Javě statické seznamy konstant (hodnot). Příkladem mohou být dny v týdnu, měsíce v roce, planety obíhající kolem slunce

Více

9 - Map/filter/reduce OMO. Ing. David Kadleček, PhD

9 - Map/filter/reduce OMO. Ing. David Kadleček, PhD 9 - Map/filter/reduce OMO Ing. David Kadleček, PhD kadlecd@fel.cvut.cz, david.kadlecek@cz.ibm.com 1 Map/filter/reduce v Java Map/filter/reduce v Java = Java 1.8 streams API Funkcionální přístup (řetězíme

Více

1. Programování proti rozhraní

1. Programování proti rozhraní 1. Programování proti rozhraní Cíl látky Cílem tohoto bloku je seznámení se s jednou z nejdůležitější programátorskou technikou v objektově orientovaném programování. Tou technikou je využívaní rozhraní

Více

typová konverze typová inference

typová konverze typová inference Seminář Java Programování v Javě II Radek Kočí Fakulta informačních technologií VUT Únor 2008 Radek Kočí Seminář Java Programování v Javě (2) 1/ 36 Téma přednášky Rozhraní: použití, dědičnost Hierarchie

Více

Návrh softwarových systém. Návrh softwarových systémů

Návrh softwarových systém. Návrh softwarových systémů Návrh softwarových systém ů - Java 8 Jiří Šebek Návrh softwarových systémů (B6B36NSS) Co je nového? Default interface methods Lambda expressions Method references and repeatable annotations Streams Functional

Více

TÉMATICKÝ OKRUH Softwarové inženýrství

TÉMATICKÝ OKRUH Softwarové inženýrství TÉMATICKÝ OKRUH Softwarové inženýrství Číslo otázky : 24. Otázka : Implementační fáze. Postupy při specifikaci organizace softwarových komponent pomocí UML. Mapování modelů na struktury programovacího

Více

1. Dědičnost a polymorfismus

1. Dědičnost a polymorfismus 1. Dědičnost a polymorfismus Cíl látky Cílem této kapitoly je představit klíčové pojmy dědičnosti a polymorfismu. Předtím však je nutné se seznámit se základními pojmy zobecnění neboli generalizace. Komentář

Více

MATURITNÍ OTÁZKY ELEKTROTECHNIKA - POČÍTAČOVÉ SYSTÉMY 2003/2004 PROGRAMOVÉ VYBAVENÍ POČÍTAČŮ

MATURITNÍ OTÁZKY ELEKTROTECHNIKA - POČÍTAČOVÉ SYSTÉMY 2003/2004 PROGRAMOVÉ VYBAVENÍ POČÍTAČŮ MATURITNÍ OTÁZKY ELEKTROTECHNIKA - POČÍTAČOVÉ SYSTÉMY 2003/2004 PROGRAMOVÉ VYBAVENÍ POČÍTAČŮ 1) PROGRAM, ZDROJOVÝ KÓD, PŘEKLAD PROGRAMU 3 2) HISTORIE TVORBY PROGRAMŮ 3 3) SYNTAXE A SÉMANTIKA 3 4) SPECIFIKACE

Více

Výchozí a statické metody rozhraní. Tomáš Pitner, upravil Marek Šabo

Výchozí a statické metody rozhraní. Tomáš Pitner, upravil Marek Šabo Výchozí a statické metody rozhraní Tomáš Pitner, upravil Marek Šabo Výchozí a statické metody rozhraní Java 8 přidává ohledně metod v rozhraní nové možnosti. Neuvidíme je tedy ve starém kódu a mnozí vývojáři

Více

Funkcionální programování

Funkcionální programování Funkcionální programování Typované - Haskell Netypované - Lisp, Scheme λ-kalkul Teoretický základ funkcionálniho programování Lambda kalkul analyzuje funkce nikoli z hlediska původního matematického smyslu

Více

Čtvrtek 8. prosince. Pascal - opakování základů. Struktura programu:

Čtvrtek 8. prosince. Pascal - opakování základů. Struktura programu: Čtvrtek 8 prosince Pascal - opakování základů Struktura programu: 1 hlavička obsahuje název programu, použité programové jednotky (knihovny), definice konstant, deklarace proměnných, všechny použité procedury

Více

Projekty pro výuku programování v jazyce Java

Projekty pro výuku programování v jazyce Java JIHOČESKÁ UNIVERZITA V ČESKÝCH BUDĚJOVICÍCH Pedagogická fakulta Katedra informatiky Akademický rok: 2006/2007 TEZE BAKALÁŘSKÉ PRÁCE Projekty pro výuku programování v jazyce Java Jméno: František Přinosil

Více

Základy objektové orientace I. Únor 2010

Základy objektové orientace I. Únor 2010 Seminář Java Základy objektové orientace I Radek Kočí Fakulta informačních technologií VUT Únor 2010 Radek Kočí Seminář Java Základy OO (1) 1/ 20 Téma přednášky Charakteristika objektově orientovaných

Více

Jazyk C# (seminář 6)

Jazyk C# (seminář 6) Jazyk C# (seminář 6) Pavel Procházka KMI 29. října 2014 Delegát motivace Delegáty a události Jak docílit v C# funkcionální práce s metodami v C je to pomocí pointerů na funkce. Proč to v C# nejde pomocí

Více

Univerzita Palackého v Olomouci Radek Janoštík (Univerzita Palackého v Olomouci) Základy programování 4 - C# 3.4.

Univerzita Palackého v Olomouci Radek Janoštík (Univerzita Palackého v Olomouci) Základy programování 4 - C# 3.4. Základy programování 4 - C# - 8. cvičení Radek Janoštík Univerzita Palackého v Olomouci 3.4.2017 Radek Janoštík (Univerzita Palackého v Olomouci) Základy programování 4 - C# 3.4.2017 1 / 10 Reakce na úkoly

Více

Využití OOP v praxi -- Knihovna PHP -- Interval.cz

Využití OOP v praxi -- Knihovna PHP -- Interval.cz Page 1 of 6 Knihovna PHP Využití OOP v praxi Po dlouhé teorii přichází na řadu praxe. V následujícím textu si vysvětlíme možnosti přístupu k databázi pomocí různých vzorů objektově orientovaného programování

Více

Obsah. Zpracoval:

Obsah. Zpracoval: Zpracoval: houzvjir@fel.cvut.cz 03. Modelem řízený vývoj. Doménový (business), konceptuální (analytický) a logický (návrhový) model. Vize projektu. (A7B36SIN) Obsah Modelem řízený vývoj... 2 Cíl MDD, proč

Více

Funkční objekty v C++.

Funkční objekty v C++. Funkční objekty v C++. Funkční objekt je instance třídy, která má jako svou veřejnou metodu operátor (), tedy operátor pro volání funkce. V dnešním článku si ukážeme jak zobecnit funkci, jak používat funkční

Více

6 Příkazy řízení toku

6 Příkazy řízení toku 6 Příkazy řízení toku Studijní cíl Tento studijní blok má za cíl pokračovat v základních prvcích jazyka Java. Konkrétně bude věnována pozornost příkazům pro řízení toku programu. Pro všechny tyto základní

Více

11.5.2012. Obsah přednášky 9. Skrývání informací. Skrývání informací. Zapouzdření. Skrývání informací. Základy programování (IZAPR, IZKPR) Přednáška 9

11.5.2012. Obsah přednášky 9. Skrývání informací. Skrývání informací. Zapouzdření. Skrývání informací. Základy programování (IZAPR, IZKPR) Přednáška 9 Obsah přednášky 9 Základy programování (IZAPR, IZKPR) Přednáška 9 Základy dědičnosti, přístupová práva Ing. Michael Bažant, Ph.D. Katedra softwarových technologií Kancelář č. 03 022, Náměstí Čs. legií

Více

PŘETĚŽOVÁNÍ OPERÁTORŮ

PŘETĚŽOVÁNÍ OPERÁTORŮ PŘETĚŽOVÁNÍ OPERÁTORŮ Jazyk C# podobně jako jazyk C++ umožňuje přetěžovat operátory, tj. rozšířit definice některých standardních operátorů na uživatelem definované typy (třídy a struktury). Stejně jako

Více

Úvod do programování - Java. Cvičení č.4

Úvod do programování - Java. Cvičení č.4 Úvod do programování - Java Cvičení č.4 1 Sekvence (posloupnost) Sekvence je tvořena posloupností jednoho nebo více příkazů, které se provádějí v pevně daném pořadí. Příkaz se začne provádět až po ukončení

Více

Generické programování

Generické programování Generické programování Od C# verze 2.0 = vytváření kódu s obecným datovým typem Příklad generická metoda, zamění dva parametry: static void Swap(ref T p1, ref T p2) T temp; temp = p1; p1 = p2; p2 =

Více

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007 Úvod do programovacích jazyků (Java) Michal Krátký Katedra informatiky VŠB Technická univerzita Ostrava Úvod do programovacích jazyků (Java), 2006/2007 c 2006 Michal Krátký Úvod do programovacích jazyků

Více

Masarykova střední škola zemědělská a Vyšší odborná škola, Opava, příspěvková organizace

Masarykova střední škola zemědělská a Vyšší odborná škola, Opava, příspěvková organizace Masarykova střední škola zemědělská a Vyšší odborná škola, Opava, příspěvková organizace Číslo projektu Číslo materiálu Autor Průřezové téma Předmět CZ.1.07/1.5.00/34.0565 VY_32_INOVACE_284_Programovací_jazyky

Více

IRAE 07/08 Přednáška č. 1

IRAE 07/08 Přednáška č. 1 Úvod do předmětu OOP Objekt Proč OOP? Literatura, osnova předmětu viz. cvičení Základní prvek OOP sw inženýrství = model reálných objektů (věcí) člověk, auto, okno (ve windows), slovník, = model abstraktní

Více

Obsah přednášky. programovacího jazyka. Motivace. Princip denotační sémantiky Sémantické funkce Výrazy Příkazy Vstup a výstup Kontinuace Program

Obsah přednášky. programovacího jazyka. Motivace. Princip denotační sémantiky Sémantické funkce Výrazy Příkazy Vstup a výstup Kontinuace Program Denotační sémantika programovacího jazyka doc. Dr. Ing. Miroslav Beneš katedra informatiky, A-1007 59 732 4213 Obsah přednášky Princip denotační sémantiky Sémantické funkce Výrazy Příkazy Vstup a výstup

Více

7. přednáška - třídy, objekty třídy objekty atributy tříd metody tříd

7. přednáška - třídy, objekty třídy objekty atributy tříd metody tříd 7. přednáška - třídy, objekty třídy objekty atributy tříd metody tříd Algoritmizace (Y36ALG), Šumperk - 7. přednáška 1 Třída jako zdroj funkcionality Třída v jazyku Java je programová jednotka tvořená

Více

Pokyny pro zpracování bakalářských prací

Pokyny pro zpracování bakalářských prací Grafická a multimediální laboratoř Vysoká škola ekonomická v Praze 2014 Pokyny pro zpracování bakalářských prací Obsah Struktura bakalářské práce... 2 Vstupní část práce... 2 Hlavní textová část práce...

Více

PB161 Programování v jazyce C++ Přednáška 7

PB161 Programování v jazyce C++ Přednáška 7 PB161 Programování v jazyce C++ Přednáška 7 Statické položky tříd Základy OOP Nikola Beneš 6. listopadu 2018 PB161 přednáška 7: static, základy OOP 6. listopadu 2018 1 / 21 Klíčové slovo static Znáte z

Více

PHP framework Nette. Kapitola 1. 1.1 Úvod. 1.2 Architektura Nette

PHP framework Nette. Kapitola 1. 1.1 Úvod. 1.2 Architektura Nette Kapitola 1 PHP framework Nette 1.1 Úvod Zkratka PHP (z anglického PHP: Hypertext Preprocessor) označuje populární skriptovací jazyk primárně navržený pro vývoj webových aplikací. Jeho oblíbenost vyplývá

Více

PB161 Programování v jazyce C++ Přednáška 7

PB161 Programování v jazyce C++ Přednáška 7 PB161 Programování v jazyce C++ Přednáška 7 Statické položky tříd Základy OOP Nikola Beneš 6. listopadu 2018 PB161 přednáška 7: static, základy OOP 6. listopadu 2018 1 / 21 Klíčové slovo static Znáte z

Více

Úvod do programovacích jazyků (Java)

Úvod do programovacích jazyků (Java) Úvod do programovacích jazyků (Java) Michal Krátký Katedra informatiky VŠB Technická univerzita Ostrava Úvod do programovacích jazyků (Java), 2007/2008 c 2006 2008 Michal Krátký Úvod do programovacích

Více

Úvod Třídy Rozhraní Pole Konec. Programování v C# Hodnotové datové typy, řídící struktury. Petr Vaněček 1 / 39

Úvod Třídy Rozhraní Pole Konec. Programování v C# Hodnotové datové typy, řídící struktury. Petr Vaněček 1 / 39 Programování v C# Hodnotové datové typy, řídící struktury Petr Vaněček 1 / 39 Obsah přednášky Referenční datové typy datové položky metody přístupové metody accessory, indexery Rozhraní Pole 2 / 39 Třídy

Více

10 Balíčky, grafické znázornění tříd, základy zapozdření

10 Balíčky, grafické znázornění tříd, základy zapozdření 10 Balíčky, grafické znázornění tříd, základy zapozdření Studijní cíl Tento studijní blok má za cíl pokračovat v základních prvcích jazyka Java. Konkrétně bude věnována pozornost příkazům balíčkům, grafickému

Více

TŘÍDY POKRAČOVÁNÍ. Události pokračování. Příklad. public delegate void ZmenaSouradnicEventHandler (object sender, EventArgs e);

TŘÍDY POKRAČOVÁNÍ. Události pokračování. Příklad. public delegate void ZmenaSouradnicEventHandler (object sender, EventArgs e); TŘÍDY POKRAČOVÁNÍ Události pokračování public delegate void ZmenaSouradnicEventHandler (object sender, EventArgs e); class Bod private int x; private int y; public event ZmenaSouradnicEventHandler ZmenaSouradnic;

Více

3. Je defenzivní programování technikou skrývání implementace? Vyberte jednu z nabízených možností: Pravda Nepravda

3. Je defenzivní programování technikou skrývání implementace? Vyberte jednu z nabízených možností: Pravda Nepravda 1. Lze vždy z tzv. instanční třídy vytvořit objekt? 2. Co je nejčastější příčinou vzniku chyb? A. Specifikace B. Testování C. Návrh D. Analýza E. Kódování 3. Je defenzivní programování technikou skrývání

Více

Vyřešené teoretické otázky do OOP ( )

Vyřešené teoretické otázky do OOP ( ) Vyřešené teoretické otázky do OOP (16. 1. 2013) 1) Vyjmenujte v historickém pořadí hlavní programovací paradigmata a stručně charakterizujte každé paradigma. a) Naivní chaotičnost, špatná syntaxe a sémantika

Více

1 Strukturované programování

1 Strukturované programování Projekt OP VK Inovace studijních oborů zajišťovaných katedrami PřF UHK Registrační číslo: CZ.1.07/2.2.00/28.0118 1 Cíl Seznámení s principy strukturovaného programování, s blokovou strukturou programů,

Více

Tento studijní blok má za cíl pokračovat v základních prvcích jazyka Java. Konkrétně bude věnována pozornost rozhraním a výjimkám.

Tento studijní blok má za cíl pokračovat v základních prvcích jazyka Java. Konkrétně bude věnována pozornost rozhraním a výjimkám. 13 Rozhraní, výjimky Studijní cíl Tento studijní blok má za cíl pokračovat v základních prvcích jazyka Java. Konkrétně bude věnována pozornost rozhraním a výjimkám. Doba nutná k nastudování 2 2,5 hodiny

Více

NetBeans platforma. Evropský sociální fond Praha & EU: Investujeme do vaší budoucnosti

NetBeans platforma. Evropský sociální fond Praha & EU: Investujeme do vaší budoucnosti NetBeans platforma Aplikační programování v Javě (BI-APJ) - 7 Ing. Jiří Daněček Katedra softwarového inženýrství Fakulta informačních technologií ČVUT Praha Evropský sociální fond Praha & EU: Investujeme

Více

Návrhové vzory. Jakub Klemsa, Jan Legerský. 30. října Objektově orientované programování.

Návrhové vzory. Jakub Klemsa, Jan Legerský. 30. října Objektově orientované programování. Jakub Klemsa Jan Legerský Objektově orientované programování klemsjak@fjfi.cvut.cz jan.legersky@gmail.com 30. října 2012 návrhový vzor (design pattern) obecné řešení problému, které se využívá při návrhu

Více

Definice třídy. úplná definice. public veřejná třída abstract nesmí být vytvářeny instance final nelze vytvářet potomky

Definice třídy. úplná definice. public veřejná třída abstract nesmí být vytvářeny instance final nelze vytvářet potomky JAVA Třídy Definice třídy úplná definice [public] [abstract] [final] class Jmeno [extends Predek] [impelements SeznamInterfacu] {... // telo tridy public veřejná třída abstract nesmí být vytvářeny instance

Více

UML. Unified Modeling Language. Součásti UML

UML. Unified Modeling Language. Součásti UML UML Unified Modeling Language 1995 počátek 1997 verze 1.0 leden dnes verze 2.0 (vývoj stále nedokončen) Standardní notace OMG podpora velkých firem (Microsoft, IBM, Oracle, HP ) popisuje struktury popisuje

Více

Bridge. Známý jako. Účel. Použitelnost. Handle/Body

Bridge. Známý jako. Účel. Použitelnost. Handle/Body Bridge Bridge Známý jako Handle/Body Účel odděluje abstrakci (rozhraní a jeho sémantiku) od její konkrétní implementace předchází zbytečnému nárůstu počtu tříd při přidávání implementací používá se v době

Více

Software602 Form Designer

Software602 Form Designer Software602 Form Designer Javascriptový vyhodnocovací mechanismus výrazů Aktualizováno: 17. 3. 2017 Software602 a.s. Hornokrčská 15 140 00 Praha 4 tel: 222 011 602 web: www.602.cz e-mail: info@602.cz ID

Více

VÝUKOVÝ MATERIÁL. Bratislavská 2166, 407 47 Varnsdorf, IČO: 18383874 www.vosassvdf.cz, tel. +420412372632 Číslo projektu

VÝUKOVÝ MATERIÁL. Bratislavská 2166, 407 47 Varnsdorf, IČO: 18383874 www.vosassvdf.cz, tel. +420412372632 Číslo projektu VÝUKOVÝ MATERIÁL Identifikační údaje školy Vyšší odborná škola a Střední škola, Varnsdorf, příspěvková organizace Bratislavská 2166, 407 47 Varnsdorf, IČO: 18383874 www.vosassvdf.cz, tel. +420412372632

Více

Úvod do programovacích jazyků (Java)

Úvod do programovacích jazyků (Java) Úvod do programovacích jazyků (Java) Michal Krátký Katedra informatiky VŠB Technická univerzita Ostrava Úvod do programovacích jazyků (Java), 2007/2008 c 2006 2008 Michal Krátký Úvod do programovacích

Více

JAVA. Další jazyky kompilovatelné do Java byte-code

JAVA. Další jazyky kompilovatelné do Java byte-code JAVA Další jazyky kompilovatelné do Java byte-code Přehled Scala objektový a funkcionální jazyk Closure funkcionální jazyk dialekt Lispu Groovy skritpovací jazyk Kotlin nová Java Jython Java implementace

Více

Vyučovací hodina. 1vyučovací hodina: 2vyučovací hodiny: Opakování z minulé hodiny. Procvičení nové látky

Vyučovací hodina. 1vyučovací hodina: 2vyučovací hodiny: Opakování z minulé hodiny. Procvičení nové látky Vyučovací hodina 1vyučovací hodina: Opakování z minulé hodiny Nová látka Procvičení nové látky Shrnutí 5 min 20 min 15 min 5 min 2vyučovací hodiny: Opakování z minulé hodiny Nová látka Procvičení nové

Více

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007 Úvod do programovacích jazyků (Java) Michal Krátký 1 Katedra informatiky VŠB Technická univerzita Ostrava Úvod do programovacích jazyků (Java), 2006/2007 c 2006 Michal Krátký Úvod do programovacích jazyků

Více

Programování v jazyce C a C++

Programování v jazyce C a C++ Programování v jazyce C a C++ Příklad na tvorbu třídy Richter 1 4. prosince 2017 1 Ing. Richter Miloslav, Ph.D., UAMT FEKT VUT Brno Dvourozměrné pole pomocí tříd Zadání Navrhněte a napište třídu pro realizace

Více

Algoritmizace a programování

Algoritmizace a programování Algoritmizace a programování Struktura programu Vytvoření nové aplikace Struktura programu Základní syntaktické elementy První aplikace Verze pro akademický rok 2012/2013 1 Nová aplikace NetBeans Ve vývojovém

Více

DSL manuál. Ing. Jan Hranáč. 27. října 2010. V této kapitole je stručný průvodce k tvorbě v systému DrdSim a (v

DSL manuál. Ing. Jan Hranáč. 27. října 2010. V této kapitole je stručný průvodce k tvorbě v systému DrdSim a (v DSL manuál Ing. Jan Hranáč 27. října 2010 V této kapitole je stručný průvodce k tvorbě v systému DrdSim a (v současné době krátký) seznam vestavěných funkcí systému. 1 Vytvoření nového dobrodružství Nejprve

Více

Matematika v programovacích

Matematika v programovacích Matematika v programovacích jazycích Pavla Kabelíková am.vsb.cz/kabelikova pavla.kabelikova@vsb.cz Úvodní diskuze Otázky: Jaké programovací jazyky znáte? S jakými programovacími jazyky jste již pracovali?

Více

Dědění, polymorfismus

Dědění, polymorfismus Programování v jazyce C/C++ Ladislav Vagner úprava Pavel Strnad Dědění. Polymorfismus. Dnešní přednáška Statická a dynamická vazba. Vnitřní reprezentace. VMT tabulka virtuálních metod. Časté chyby. Minulá

Více

Dynamicky vázané metody. Pozdní vazba, virtuální metody

Dynamicky vázané metody. Pozdní vazba, virtuální metody Dynamicky vázané metody Pozdní vazba, virtuální metody Motivace... class TBod protected: float x,y; public: int vrat_pocet_bodu() return 1; ; od třídy TBod odvodíme: class TUsecka: public TBod protected:

Více

IB111 Úvod do programování skrze Python Přednáška 13

IB111 Úvod do programování skrze Python Přednáška 13 IB111 Úvod do programování skrze Python Přednáška 13 Programovací jazyky Nikola Beneš 14. prosinec 2016 IB111 přednáška 13: programovací jazyky 14. prosinec 2016 1 / 21 Osnova dnešní přednášky Programovací

Více

Seminář Java IV p.1/38

Seminář Java IV p.1/38 Seminář Java IV Seminář Java IV p.1/38 Rekapitulace Deklarace tříd Proměnné, metody, konstruktory, modifikátory přístupu Datové typy primitivní, objektové, pole Dědičnost Řídící konstrukce Podmínky, cykly

Více

1 Nejkratší cesta grafem

1 Nejkratší cesta grafem Bakalářské zkoušky (příklady otázek) podzim 2014 1 Nejkratší cesta grafem 1. Uvažujte graf s kladným ohodnocením hran (délka). Definujte formálně problém hledání nejkratší cesty mezi dvěma uzly tohoto

Více

DUM 06 téma: Tvorba makra pomocí VBA

DUM 06 téma: Tvorba makra pomocí VBA DUM 06 téma: Tvorba makra pomocí VBA ze sady: 03 tematický okruh sady: Tvorba skript a maker ze šablony: 10 Algoritmizace a programování určeno pro: 4. ročník vzdělávací obor: 18-20-M/01 Informační technologie

Více

11 Diagram tříd, asociace, dědičnost, abstraktní třídy

11 Diagram tříd, asociace, dědičnost, abstraktní třídy 11 Diagram tříd, asociace, dědičnost, abstraktní třídy Studijní cíl Tento studijní blok má za cíl pokračovat v základních prvcích jazyka Java. Konkrétně bude věnována pozornost diagramům tříd, asociaci,

Více

7 Formátovaný výstup, třídy, objekty, pole, chyby v programech

7 Formátovaný výstup, třídy, objekty, pole, chyby v programech 7 Formátovaný výstup, třídy, objekty, pole, chyby v programech Studijní cíl Tento studijní blok má za cíl pokračovat v základních prvcích jazyka Java. Konkrétně bude věnována pozornost formátovanému výstupu,

Více

přetížení operátorů (o)

přetížení operátorů (o) přetížení operátorů (o) - pro vlastní typy je možné přetížit i operátory (tj. definovat vlastní) - pro definici slouží klíčové slovo operator následované typem/znakem operátoru - deklarace pomocí funkčního

Více

Seznamy a iterátory. Kolekce obecně. Rozhraní kolekce. Procházení kolekcí

Seznamy a iterátory. Kolekce obecně. Rozhraní kolekce. Procházení kolekcí Kolekce obecně Seznamy a iterátory doc. Ing. Miroslav Beneš, Ph.D. katedra informatiky FEI VŠB-TUO A-1007 / 597 324 213 http://www.cs.vsb.cz/benes Miroslav.Benes@vsb.cz Kolekce ::= homogenní sada prvků

Více

24-2-2 PROMĚNNÉ, KONSTANTY A DATOVÉ TYPY TEORIE DATUM VYTVOŘENÍ: 23.7.2013 KLÍČOVÁ AKTIVITA: 02 PROGRAMOVÁNÍ 2. ROČNÍK (PRG2) HODINOVÁ DOTACE: 1

24-2-2 PROMĚNNÉ, KONSTANTY A DATOVÉ TYPY TEORIE DATUM VYTVOŘENÍ: 23.7.2013 KLÍČOVÁ AKTIVITA: 02 PROGRAMOVÁNÍ 2. ROČNÍK (PRG2) HODINOVÁ DOTACE: 1 24-2-2 PROMĚNNÉ, KONSTANTY A DATOVÉ TYPY TEORIE AUTOR DOKUMENTU: MGR. MARTINA SUKOVÁ DATUM VYTVOŘENÍ: 23.7.2013 KLÍČOVÁ AKTIVITA: 02 UČIVO: STUDIJNÍ OBOR: PROGRAMOVÁNÍ 2. ROČNÍK (PRG2) INFORMAČNÍ TECHNOLOGIE

Více

Programování II. Modularita 2017/18

Programování II. Modularita 2017/18 Programování II Modularita 2017/18 Modul? Osnova přednášky Vývoj programování Modularita Příklad Vývoj programování Paradigmata programování Jak a proč se jazyky vyvíjejí? V čem se OOP liší od předchozích

Více

5 Přehled operátorů, příkazy, přetypování

5 Přehled operátorů, příkazy, přetypování 5 Přehled operátorů, příkazy, přetypování Studijní cíl Tento studijní blok má za cíl pokračovat v základních prvcích jazyka Java. Konkrétně budou uvedeny detaily týkající se operátorů. Doba nutná k nastudování

Více

GTL GENERATOR NÁSTROJ PRO GENEROVÁNÍ OBJEKTŮ OBJEKTY PRO INFORMATICA POWERCENTER. váš partner na cestě od dat k informacím

GTL GENERATOR NÁSTROJ PRO GENEROVÁNÍ OBJEKTŮ OBJEKTY PRO INFORMATICA POWERCENTER. váš partner na cestě od dat k informacím GTL GENERATOR NÁSTROJ PRO GENEROVÁNÍ OBJEKTŮ OBJEKTY PRO INFORMATICA POWERCENTER váš partner na cestě od dat k informacím globtech spol. s r.o. karlovo náměstí 17 c, praha 2 tel.: +420 221 986 390 info@globtech.cz

Více

Úvod. Programovací paradigmata

Úvod. Programovací paradigmata .. Úvod. Programovací paradigmata Programovací techniky doc. Ing. Jiří Rybička, Dr. ústav informatiky PEF MENDELU v Brně rybicka@mendelu.cz Cíl: programování efektivně a bezpečně Programovací techniky

Více

Návod na základní používání Helpdesku AGEL

Návod na základní používání Helpdesku AGEL Návod na základní používání Helpdesku AGEL Úvod Přihlášení Nástěnka Vyhledání a otevření úlohy Otevření úlohy Seznam úloh Vyhledávání úloh Vytvoření nové úlohy Práce s úlohami Editace úlohy Změna stavu

Více

Paradigmata programování 1

Paradigmata programování 1 Paradigmata programování 1 Tečkové páry, symbolická data a kvotování Vilém Vychodil Katedra informatiky, PřF, UP Olomouc Přednáška 4 V. Vychodil (KI, UP Olomouc) Tečkové páry, symbolická data a kvotování

Více

Programovací jazyky. imperativní (procedurální) neimperativní (neprocedurální) assembler (jazyk symbolických instrukcí)

Programovací jazyky. imperativní (procedurální) neimperativní (neprocedurální) assembler (jazyk symbolických instrukcí) Programovací jazyky Programovací jazyky nižší assembler (jazyk symbolických instrukcí) vyšší imperativní (procedurální) Pascal, C/C++, Java, Basic, Python, php neimperativní (neprocedurální) Lisp, Prolog

Více

Statické proměnné a metody. Tomáš Pitner, upravil Marek Šabo

Statické proměnné a metody. Tomáš Pitner, upravil Marek Šabo Statické proměnné a metody Tomáš Pitner, upravil Marek Šabo Úvod Se statickou metodou jsme se setkali už u úplně prvního programu - Hello, world! public class Demo { public static void main(string[] args)

Více

Pokročilé programování v jazyce C pro chemiky (C3220) Operátory new a delete, virtuální metody

Pokročilé programování v jazyce C pro chemiky (C3220) Operátory new a delete, virtuální metody Pokročilé programování v jazyce C pro chemiky (C3220) Operátory new a delete, virtuální metody Dynamická alokace paměti Jazyky C a C++ poskytují programu možnost vyžádat si část volné operační paměti pro

Více

VÝUKOVÝ MATERIÁL. Bratislavská 2166, 407 47 Varnsdorf, IČO: 18383874 www.vosassvdf.cz, tel. +420412372632 Číslo projektu

VÝUKOVÝ MATERIÁL. Bratislavská 2166, 407 47 Varnsdorf, IČO: 18383874 www.vosassvdf.cz, tel. +420412372632 Číslo projektu VÝUKOVÝ MATERIÁL Identifikační údaje školy Vyšší odborná škola a Střední škola, Varnsdorf, příspěvková organizace Bratislavská 2166, 407 47 Varnsdorf, IČO: 18383874 www.vosassvdf.cz, tel. +420412372632

Více

20. Projekt Domácí mediotéka

20. Projekt Domácí mediotéka Projekt Domácí mediotéka strana 211 20. Projekt Domácí mediotéka 20.1. Základní popis, zadání úkolu V projektu Domácí mediotéka (Dome) se jednoduchým způsobem evidují CD a videa. Projekt je velmi jednoduchý

Více

Maturitní otázky z předmětu PROGRAMOVÁNÍ

Maturitní otázky z předmětu PROGRAMOVÁNÍ Wichterlovo gymnázium, Ostrava-Poruba, příspěvková organizace Maturitní otázky z předmětu PROGRAMOVÁNÍ 1. Algoritmus a jeho vlastnosti algoritmus a jeho vlastnosti, formy zápisu algoritmu ověřování správnosti

Více

Abstraktní třída a rozhraní

Abstraktní třída a rozhraní Abstraktní třída a rozhraní Někdy se může stát, zejména při psaní v hierarchické struktuře hodně nadřazených tříd, že tušíme, že bude ve zděděných třídách vhodné použít nějakou metodu. Tuto metodu ještě

Více

Softwarové komponenty a Internet

Softwarové komponenty a Internet Softwarové komponenty a Internet Doc. Dr. Ing. Miroslav Beneš Katedra informatiky FEI VŠB-TU Ostrava Miroslav.Benes@vsb.cz Obsah přednášky Motivace Vývoj přístupů k tvorbě programů Definice komponenty

Více

IB111 Programování a algoritmizace. Programovací jazyky

IB111 Programování a algoritmizace. Programovací jazyky IB111 Programování a algoritmizace Programovací jazyky Programovací jazyky Programovací jazyk Prostředek pro zápis algoritmů, jež mohou být provedeny na počítači Program Zápis algoritmu v programovacím

Více

Abstraktní datové typy: zásobník

Abstraktní datové typy: zásobník Abstraktní datové typy: zásobník doc. Ing. Miroslav Beneš, Ph.D. katedra informatiky FEI VŠB-TUO A-1007 / 597 324 213 http://www.cs.vsb.cz/benes Miroslav.Benes@vsb.cz Abstraktní datové typy omezené rozhraní

Více

UJO Framework. revoluční architektura beans. verze 0.80 http://ujoframework.org/

UJO Framework. revoluční architektura beans. verze 0.80 http://ujoframework.org/ UJO Framework revoluční architektura beans verze 0.80 http://ujoframework.org/ Pavel Pone(c), září 2008 Historie rok 2004 upravené objekty z frameworku Cayenne nevýhodou byla špatná typová kontrola rok

Více

Vytváření a použití knihoven tříd

Vytváření a použití knihoven tříd Vytváření a použití knihoven tříd doc. Ing. Miroslav Beneš, Ph.D. katedra informatiky FEI VŠB-TUO A-1007 / 597 324 213 http://www.cs.vsb.cz/benes Miroslav.Benes@vsb.cz Prostory jmen motivace spolupráce

Více

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007 Úvod do programovacích jazyků (Java) Michal Krátký Katedra informatiky VŠB Technická univerzita Ostrava Úvod do programovacích jazyků (Java), 2006/2007 c 2006 Michal Krátký Úvod do programovacích jazyků

Více

2) Napište algoritmus pro vložení položky na konec dvousměrného seznamu. 3) Napište algoritmus pro vyhledání položky v binárním stromu.

2) Napište algoritmus pro vložení položky na konec dvousměrného seznamu. 3) Napište algoritmus pro vyhledání položky v binárním stromu. Informatika 10. 9. 2013 Jméno a příjmení Rodné číslo 1) Napište algoritmus pro rychlé třídění (quicksort). 2) Napište algoritmus pro vložení položky na konec dvousměrného seznamu. 3) Napište algoritmus

Více

Functional and Logic Programming Functional languages

Functional and Logic Programming Functional languages Functional and Logic Programming Functional languages Ing. Marek Běhálek FEI VŠB-TUO A-1018 / 597 324 251 http://www.cs.vsb.cz/behalek marek.behalek@vsb.cz This presentation is based on original course

Více

6. Příkazy a řídící struktury v Javě

6. Příkazy a řídící struktury v Javě 6. Příkazy a řídící struktury v Javě Příkazy v Javě Příkazy v Javě Řídicí příkazy (větvení, cykly) Přiřazovací příkaz = Řízení toku programu (větvení, cykly) Volání metody Návrat z metody - příkaz return

Více

Z. Kotala, P. Toman: Java ( Obsah )

Z. Kotala, P. Toman: Java ( Obsah ) Z. Kotala, P. Toman: Java ( Obsah ) 13. Výjimky Výjimka (exception) je definována jako událost, která nastane během provádění programu a která naruší normální běh instrukcí. Výjimka je vyvolána například

Více

1. lekce. do souboru main.c uložíme následující kód a pomocí F9 ho zkompilujeme a spustíme:

1. lekce. do souboru main.c uložíme následující kód a pomocí F9 ho zkompilujeme a spustíme: 1. lekce 1. Minimální program do souboru main.c uložíme následující kód a pomocí F9 ho zkompilujeme a spustíme: #include #include int main() { printf("hello world!\n"); return 0; 2.

Více

Při studiu tohoto bloku se předpokládá, že student je zvládá základy programování v jazyce Java s využitím vývojového prostředí NetBeans.

Při studiu tohoto bloku se předpokládá, že student je zvládá základy programování v jazyce Java s využitím vývojového prostředí NetBeans. 1 Grafické rozhraní Studijní cíl Tento blok je věnován vytváření programů s využitím grafického rozhraní (GUI). Vysvětlen bude základní filozofie pro vytváření aplikací s GUI ve srovnání s konzolovými

Více

Algoritmizace a programování

Algoritmizace a programování Algoritmizace a programování Řídicí struktury jazyka Java Struktura programu Příkazy jazyka Blok příkazů Logické příkazy Ternární logický operátor Verze pro akademický rok 2012/2013 1 Struktura programu

Více

Algoritmizace prostorových úloh

Algoritmizace prostorových úloh INOVACE BAKALÁŘSKÝCH A MAGISTERSKÝCH STUDIJNÍCH OBORŮ NA HORNICKO-GEOLOGICKÉ FAKULTĚ VYSOKÉ ŠKOLY BÁŇSKÉ - TECHNICKÉ UNIVERZITY OSTRAVA Algoritmizace prostorových úloh Algoritmus Daniela Szturcová Tento

Více