Lambda-výrazy. Pecinovský

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

Download "Lambda-výrazy. Pecinovský"

Transkript

1 Copyright Rudolf Pecinovský, Soubor: 09_Lambda_vyrazy.doc, verze , uloženo ne :36 1 z 82 Lambda-výrazy Pecinovský rudolf@pecinovsky.cz

2 Copyright Rudolf Pecinovský, Soubor: 09_Lambda_vyrazy.doc, verze , uloženo ne :36 2 z 82 Obsah 1. Terminologie 2. Funkční interfejsy a lambda výrazy 3. Nová koncepce konstrukce interface 4. Datový typ java.util.optional<t> 5. Datové proudy 6. KONEC

3 Copyright Rudolf Pecinovský, Soubor: 09_Lambda_vyrazy.doc, verze , uloženo ne :36 3 z Terminologie Obsah 1.1 Rozhraní Interfejs 1.2 Přetížení zakrytí přebití předefinování Přetížení metody method overloading Zakrytí metody method hiding Přebití metody method overriding Časná a pozdní vazba early and late binding VMT Předefinování metody method redefining Přepsání metody method rewriting

4 1.1 Rozhraní Interfejs Rozhraní Vlastnost entity programu určující, co okolní program o dané entitě ví a jak s ní může komunikovat Rozhraní mí dvě složky: Signatura označuje tu jeho část, kterou může zkontrolovat překladač Kontrakt označuje část, o jejíž dodržení se musí postarat programátor Interfejs Programová konstrukce umožňující definovat rozhraní bez implementace Počeštěný (a jazykovými slovníky povolený) tvar používám proto, abych mohl termín v textu skloňovat Copyright Rudolf Pecinovský, Soubor: 09_Lambda_vyrazy.doc, verze , uloženo ne :36 4 z 82

5 Copyright Rudolf Pecinovský, Soubor: 09_Lambda_vyrazy.doc, verze , uloženo ne :36 5 z Přetížení zakrytí přebití předefinování Přetížení metody method overloading Několik metod má stejný název a liší se pouze v počtu a/nebo typu svých parametrů Zakrytí metody method hiding Potomek definuje metodou se stejnou signaturou jako rodič, avšak rodičovská metoda zůstává nadále dostupná Přebití metody method overriding Potomek definuje vlastní verzi zděděné virtuální metody; tato metoda musí mít signaturu kompatibilní s přebitou metodou Předefinování metody method redefining Dochází ke změně kódu metody prostřednictvím nástrojů pro instrumentaci kódu Přepsání metody method rewriting Dochází ke změně kódu metody v důsledku refaktorace či oprav chybného kódu

6 1.2.1 Přetížení metody method overloading Několik metod má stejný název a liší se pouze v počtu a/nebo typu svých parametrů Nestačí, pokud se liší pouze v názvu parametrů, metody se musejí opravdu lišit v počtu svých parametrů a/nebo se musejí lišit typy alespoň v jedné dvojici vzájemně si odpovídajících parametrů Příklad: public void setposition(int x, int y); public void setposition(position position) Copyright Rudolf Pecinovský, Soubor: 09_Lambda_vyrazy.doc, verze , uloženo ne :36 6 z 82

7 Copyright Rudolf Pecinovský, Soubor: 09_Lambda_vyrazy.doc, verze , uloženo ne :36 7 z Zakrytí metody method hiding Potomek definuje metodou se stejnou signaturou jako rodič, avšak rodičovská metoda zůstává nadále dostupná Zakrytí se v Javě uplatní pouze u statických metod K zakryté rodičovské metodě se dostanu vhodnou kvalifikací Statická metoda nesmí zakrýt instanční metodu Příklad: public class Mother { public static void hiding() { System.out.println("Definovaná v Mother, zakrytá v Daughter"); public class Daughter extends Mother{ public static void hiding() { System.out.println("Definovaná v Daughter, zakrývající tu v Mother");

8 Copyright Rudolf Pecinovský, Soubor: 09_Lambda_vyrazy.doc, verze , uloženo ne :36 8 z Přebití metody method overriding Potomek definuje vlastní verzi zděděné virtuální metody; tato metoda musí mít signaturu kompatibilní s přebitou metodou Přebití se uplatní pouze u virtuálních metod Virtuální metoda je taková, jejíž implementace a začlenění do programu umožňuje její přebití Chování je stejné jako v kartách: metoda potomka přebije rodičovskou, takže tato se neuplatní, i když nadále existuje nezměněná Typy parametrů a návratové hodnoty mohou být stejné, ale nemusí; protože proměnná předka akceptuje odkaz na instanci potomka Typ parametrů musí akceptovat proměnné typu deklarovaného rodičem => typ parametru v přebíjející metodě může být rodičem typu odpovídajícího parametru v metodě přebité Typ návratové hodnoty být přiřaditelný do proměnné typu deklarovaného rodičem => typ návratové hodnoty přebíjející metody může být potomkem typu návratové hodnoty přebíjené metody Příklad: public String tostring() { return "Přebíjí metodu zděděnou od předka.";

9 Copyright Rudolf Pecinovský, Soubor: 09_Lambda_vyrazy.doc, verze , uloženo ne :36 9 z Časná a pozdní vazba early and late binding V souvislosti s přebíjením metod se často hovoří o časné a pozdní vazbě (early and late binding) Časná vazba označuje situaci, kdy překladač již při překladu ví, která metoda bude volána a může je proto v kódu volat přímo, anebo dokonce nahradit volání metody kopií jejího těla (in-lined code) Pozdní vazba označuje stav, kdy se to, která konkrétní metoda bude volána, zjistí až za běhu, a proto je nutné použít nepřímé metody volání Pozdní vazba se většinou realizuje prostřednictvím tabulky virtuálních metod (VMT virtual method table) VMT obsahuje adresy na kódy virtuálních metod Překladač o každé metodě ví, kolikátá je ve VMT Dceřiné typy přebírají VMT svého rodiče a mohu do něj přidat další položky Přebije-li dceřiná metoda rodičovskou, překladač zařídí, aby příslušný odkaz ve VMT odkazoval na dceřinou metodu

10 1.2.5 VMT Copyright Rudolf Pecinovský, Soubor: 09_Lambda_vyrazy.doc, verze , uloženo ne :36 10 z 82

11 Copyright Rudolf Pecinovský, Soubor: 09_Lambda_vyrazy.doc, verze , uloženo ne :36 11 z Předefinování metody method redefining Dochází ke změně kódu metody prostřednictvím nástrojů pro instrumentaci kódu Tyto nástroje mohou změnit definici třídy (a tím i jejich metod) v průběhu zavádění třídy instancí třídy ClassLoader Prostřednictvím instrumentace se může teoreticky změnit signatura metody, nicméně v zájmu konzistence s ostatním kódem se tak nečiní, protože jinak by bylo třeba upravit i další kód Někdy se tímto termínem označuje změna definice metody v důsledku nějaké refaktorace

12 Copyright Rudolf Pecinovský, Soubor: 09_Lambda_vyrazy.doc, verze , uloženo ne :36 12 z Přepsání metody method rewriting Dochází ke změně kódu metody v důsledku refaktorace či oprav chybného kódu Po přepsání metody je, a rozdíl od předchozích operací, nutný nový překlad dané třídy. Při přepsání metody se může změnit její signatura Refaktorace kódu = úpravy, které upravují strukturu kódu, ale nemění jeho funkci Přejmenování třídy / atributu /metody Záměna pořadí parametrů metody Náhrada parametru soukromé metody atributem a naopak Vyjmutí skupiny příkazů do samostatné metody, která je pak z původní metody volána Převedení posloupnosti rozhodování na aplikaci vzoru Stav

13 2. Funkční interfejsy a lambda výrazy Obsah 2.1 Návrhový vzor Příkaz (Command) 2.2 Funkční interfejs Funkční interfejsy v balíčku java.util.function Důležité funkční interfejsy z jiných balíčků 2.3 Lambda-výrazy Syntaktická pravidla Použití v programu Lambda-výraz jako parametr teorie Lambda-výraz jako parametr příklad Rozšířená verze příkladu Metody jako hodnoty lambda-výrazů Příklad Metoda volající zadanou metodu Použití metody report( ) Využití konstruktoru jako tovární metody 2.4 Další syntaktická a sémantická pravidla Použití this a super v lambda-výrazech Lambda-výrazy anonymní třídy Lambda-výrazy uzávěry Copyright Rudolf Pecinovský, Soubor: 09_Lambda_vyrazy.doc, verze , uloženo ne :36 13 z 82

14 Copyright Rudolf Pecinovský, Soubor: 09_Lambda_vyrazy.doc, verze , uloženo ne :36 14 z Návrhový vzor Příkaz (Command) Inverzní vzor ke vzoru Služebník: Máme objekt, který něco umí, ale nezná nějakou klíčovou akci tu mu předáme prostřednictvím objektu předaného v parametru Program zabalí akci do objektu, který předá metodě v parametru /** Světlo zadaný počet krát na zabliká. */ public void blink(int times, int period) { class MyRunnable implements Runnable { public void run() { switchon(); IO.pause(period/2); switchoff(); IO.pause(period/2); ; Runnable action = new MyRunnable(); //Metoda repeat očekává v prvním parametru počet opakování //a v druhém parametru parametru akci, která se má opakovat new Repeater().repeat(times, action);

15 2.2 Funkční interfejs Dosud jediná vyčleněná kategorie: značkovací interfejsy (tagging/marking interfaces) Nedeklarují žádnou abstraktní metodu (deklarují pouze kontrakt), a proto nevyžadují implementaci nějaké metody Nová kategorie: funkční interfejsy (function interfaces) Deklarují právě jednu abstraktní metodu (tj. vyžadující implementaci právě jedné metody); Neabstraktních metod může mít kolik chce Pokud interfejs přebije kontrakt některé z metod zděděných od třídy Object, není to deklarace abstraktní metody Nepočítají se ani statické metody a metody s implicitní implementací Ve standardní knihovně byla takovýchto interfejsů řada, ale doposud byly především jednoúčelové (Comparable, Runnable,...) Copyright Rudolf Pecinovský, Soubor: 09_Lambda_vyrazy.doc, verze , uloženo ne :36 15 z 82

16 Copyright Rudolf Pecinovský, Soubor: 09_Lambda_vyrazy.doc, verze , uloženo ne :36 16 z Rozhodneme-li se definovat funkční interfejs, je vhodné anotovat daný typ Anotace není povinná, ale poskytuje překladači informaci, že má u daného datového typu zkontrolovat, že se opravdu jedná o interfejs s jedinou abstraktní metodou Ve standardní knihovně je 231 funkčních interfejsů, přičemž pouze 57 z nich je takto anotováno Program javadoc při vytváření dokumentace nezávisle na anotaci zjistí, zda právě vytváří dokumentaci funkčního interfejsu, a pokud ano, doplní do záhlaví dokumentační stránky zprávu Functional Interface: This is a functional interface and can therefore be used as the assignment target for a lambda expression or method reference.

17 2.2.2 Funkční interfejsy v balíčku java.util.function Nová verze knihovny přináší speciální balíček java.util.function, definující celou řadu obecných funkčních interfejsů V balíčku je 43 interfejsů rozdělených do několika skupin: Metody interfejsů ze skupiny Consumer jsou čistí konzumenti. Zpracují své parametry, ale nic nevrací. Metody interfejsů ze skupiny Supplier jsou naopak čistí producenti. Nepotřebují žádné parametry a vracejí hodnotu zadaného typu. Metody interfejsů ze skupiny Function jsou klasické funkce: zpracují svůj parametr a vrátí funkční hodnotu. Metody interfejsů ze skupiny UnaryOperator představují unární operátory. Jsou definovány jako potomci funkcí, jejichž návratová hodnota je stejného typu jako jejich parametr. Metody interfejsů ze skupiny BinaryOperator představují binární operátory. Jsou také definovány jako potomci funkcí, tentokrát funkcí se dvěma parametry přičemž typy obou parametrů i funkční hodnoty jsou shodné. Metody interfejsů ze skupiny Predicate slouží k získání logické hodnoty odvozené z hodnoty jejich parametru. Copyright Rudolf Pecinovský, Soubor: 09_Lambda_vyrazy.doc, verze , uloženo ne :36 17 z 82

18 Copyright Rudolf Pecinovský, Soubor: 09_Lambda_vyrazy.doc, verze , uloženo ne :36 18 z 82 //Producenti žádné parametry, jen vracejí hodnotu Supplier<T> T get() BooleanSupplier boolean getasboolean() DoubleSupplier double getasdouble() IntSupplier int getasint() LongSupplier long getaslong() //Konzumenti Zpracují parametry, nic nevracejí //Jednoparametričtí Consumer<T> void accept(t value) DoubleConsumer void accept(double value) IntConsumer void accept(int value) LongConsumer void accept(long value) //Dvouparametričtí BiConsumer<T, U> void accept(t t, U value) ObjDoubleConsumer void accept(t t, double value) ObjIntConsumer void accept(t t, int value) ObjLongConsumer void accept(t t, long value)

19 Copyright Rudolf Pecinovský, Soubor: 09_Lambda_vyrazy.doc, verze , uloženo ne :36 19 z 82 //Funkce zpracují parametr (parametry) a vrátí hodnotu //Jednoparametrické vracející objekt Function <T, R> R apply(t value) DoubleFunction < R> R apply(double value) IntFunction < R> R apply(int value) LongFunction < R> R apply(long value) // Jednoparametrické vracející hodnotu primitivního typu ToIntFunction <T> int applyasint (T value) ToDoubleFunction<T> double applyasdouble(t value) ToLongFunction <T> long applyaslong (T value) DoubleToIntFunction int applyasint (double value) DoubleToLongFunction long applyaslong (double value) IntToDoubleFunction double applyasdouble(int value) IntToLongFunction long applyaslong (int value) LongToDoubleFunction double applyasdouble(long value) LongToIntFunction int applyasint (long value) //Dvouparametrické BiFunction <T, U, R> R apply (T t, U u) ToDoubleBiFunction<T, U, R> double applyasdouble(t t, U u) ToIntBiFunction <T, U, R> int applyasint (T t, U u) ToLongBiFunction <T, U, R> long applyaslong (T t, U u)

20 Copyright Rudolf Pecinovský, Soubor: 09_Lambda_vyrazy.doc, verze , uloženo ne :36 20 z 82 //Predikáty metody (funkce) vracející logickou hodnotu Predicate<T> boolean test(t value) DoublePredicate boolean test(double value) IntPredicate boolean test(int value) LongPredicate boolean test(long value) BiPredicate<T, U> boolean test(t t, U u) //Unární operátory UnaryOperator<T> T apply (T operand) DoubleUnaryOperator double applyasdouble(double operand) IntUnaryOperator int applyasint (int operand) LongUnaryOperator long applyaslong (long operand) //Binární operátory BinaryOperator<T> T apply (T left, T right) DoubleBinaryOperator double applyasdouble(double left, double right) IntBinaryOperator int applyasint (int left, int right) LongBinaryOperator long applyaslong (long left, long right)

21 Copyright Rudolf Pecinovský, Soubor: 09_Lambda_vyrazy.doc, verze , uloženo ne :36 21 z Důležité funkční interfejsy z jiných balíčků //Balíček: java.awt.event ActionListener void actionperformed(actionevent e) //Balíček: java.io Closeable FileFilter FilenameFilter Flushable void close() boolean accept(file pathname) boolean accept(file dir, String name) void flush() //Balíček: java.lang AutoCloseable void close() Comparable<T> int compareto(t o) Iterable<T> Iterator<T> iterator() Runnable void run() //Balíček: java.util. Comparator<T> Observer boolean equals(object obj) void update(observable o, Object arg)

22 Copyright Rudolf Pecinovský, Soubor: 09_Lambda_vyrazy.doc, verze , uloženo ne :36 22 z Lambda-výrazy Lambda-výrazy představují způsob, jak definovat jako objekt nějakou část kódu, kterou bychom v jiné části programu rádi použili Lambda-výraz můžeme uložit do proměnné funkčního typu a předávat metodám jako hodnotu parametru tohoto typu Překladač definuje lambda-výraz jako instanci funkčního interfejsu, jehož metoda má odpovídající parametry a vrací hodnotu odpovídajícího typu (příslušný převod překladač zařídí) Lambda výraz se definuje některým z následujících způsobů: (parametry) -> { příkazy //Obecný tvar parametr -> { příkazy //Jediný parametr (parametry) -> výraz //Tělo tvoří pouze vyhodnocovaný výraz parametr -> výraz //Jediný parametr + pouze výraz

23 2.3.1 Syntaktická pravidla Je-li vlevo jediný parametr, nemusí se dávat do kulatých závorek; není-li žádný nebo je-li jich více, závorky jsou potřeba Dokáže-li si překladač odvodit typ parametru, nemusí se uvádět Pokud se vpravo pouze vyhodnocuje nějaký výraz, jehož hodnota se vrací, nemusí se dávat do složených závorek. Z lokálních proměnných lze v lambda výrazu použít pouze tzv. efektivní lokální konstanty metody, v níž je výraz definován, tj.: Klasické konstanty (tj. proměnné definované s modifikátorem final) Proměnné, které by překladač jako konstanty akceptoval (jakmile je jim přiřazena nějaká hodnota, už se nemění). Pro atributy žádná omezení na konstanty neplatí Potřebujeme-li v lambda-výrazu používat lokální proměnnou hodnotu, musím ji zabalit do konstantního mutable objektu Copyright Rudolf Pecinovský, Soubor: 09_Lambda_vyrazy.doc, verze , uloženo ne :36 23 z 82

24 Copyright Rudolf Pecinovský, Soubor: 09_Lambda_vyrazy.doc, verze , uloženo ne :36 24 z Použití v programu Světlo schopné nezávislého blikání použitelné např. pro blinkr auta použijeme návrhový vzor Služebník (původní verze s anonymní třídou) /*************************************************************************** * Světlo zadaný počet krát na zabliká, tj. * na zadaný počet milisekund se rozsvítí a na stejnou dobu zhasne. * Akce probíhá na pozadí, takže nijak neovlivňuje běh okolního programu. * times Kolikrát světlo blikne period Perioda blikání zadaná v milisekundách */ public void blink(int times, int period) { Runnable action = () -> { switchon(); IO.pause(period/2); switchoff(); IO.pause(period/2); ; new Repeater().repeat(times, action);

25 Copyright Rudolf Pecinovský, Soubor: 09_Lambda_vyrazy.doc, verze , uloženo ne :36 25 z Lambda-výraz jako parametr teorie Předchozí program ale není zcela funkční, protože blikající světlo neumí zjistit, jestli stále bliká, anebo již doblikalo Problém můžeme vyřešit tak, že opětovně použijeme návrhový vzor posluchač a přihlásíme se u opakovače jako čekatelé na ukončení opakování Přihlašujeme se tak, že jako další parametr metody spouštějící opakované blikání, zadáme metodu, která se má spustit po skončení opakování

26 Copyright Rudolf Pecinovský, Soubor: 09_Lambda_vyrazy.doc, verze , uloženo ne :36 26 z Lambda-výraz jako parametr příklad Definujeme světlo, které umí požadovaný počet krát zablikat Chceme-li je použít jako ukazatel směru auta, nemůžeme použít cyklus, protože by při blikání auto zastavilo Potřebujeme spustit blikání v samostatném vlákně, aby činnost tohoto kódu neovlivňovala činnost zbytku programu Využijeme návrhový vzor služebník: instance třídy Repeater umějí zadaný počet krát provést zadanou akci předanou v parametru /** Atribut, v němž budeme uchovávat instanci služebníka. */ private Repeater repeater = null; /** * Zjistí, jestli dané světlo právě bliká. */ public boolean isblinking() { return repeater!= null;

27 Copyright Rudolf Pecinovský, Soubor: 09_Lambda_vyrazy.doc, verze , uloženo ne :36 27 z 82 Lambda-výraz jako parametr pokračování /** * Požadovaný poček krát světlem blikne nezávisle na činnosti zbytku programu, * přičemž po ukončení blikání zavolá zadanou metodu. * Nula krát znamená pořád, dokud nezavoláme stopblinking(). */ public void blink(int times, int period, Runnable finished) { assert isblinking() : "Blikání bylo spuštěno před ukončením předchozího"; repeater = new Repeater(); Runnable action = () -> { switchon(); IO.pause(period/2); switchoff(); IO.pause(period/2); ; Runnable blinkingfinished = () -> { repeater = null; finished.run(); ; repeater.repeat(times, action, blinkingfinished);

28 Copyright Rudolf Pecinovský, Soubor: 09_Lambda_vyrazy.doc, verze , uloženo ne :36 28 z Rozšířená verze předchozího příkladu Přidáváme možnost definice zavírací akce private Repeater repeater = null; //** Zjistí, jestli dané světlo právě bliká. */ public boolean isblinking() { return repeater!= null; /** Ukončí blikání a zapomene odkaz na opakovač. */ public void stopblinking() { assert (repeater!= null) : "Pokus o ukončení neexistujícího blikání"; repeater.stop(); repeater = null; /**Požadovaný poček krát světlem blikne nezávisle na činnosti zbytku programu. * Nula krát znamená pořád, dokud nezavoláme stopblinking(). */ public void blink(int times, int period) { blink(times, period, () -> {);

29 Copyright Rudolf Pecinovský, Soubor: 09_Lambda_vyrazy.doc, verze , uloženo ne :36 29 z 82 /**Požadovaný poček krát světlem blikne nezávisla na činnosti zbytku programu, * Přičemž po ukončení blikání zavolá zadanou metodu. * Nula krát znamená pořád, dokud nezavoláme stopblinking(). */ public void blink(int times, int period, Runnable finished) { assert isblinking() : "Blikání bylo spuštěno před ukončením předchozího"; repeater = new Repeater(); Runnable action = () -> { switchon(); IO.pause(period/2); switchoff(); IO.pause(period/2); ; Runnable blinkingfinished = () -> { repeater = null; finished.run(); ; repeater.repeat(times, action, blinkingfinished);

30 Copyright Rudolf Pecinovský, Soubor: 09_Lambda_vyrazy.doc, verze , uloženo ne :36 30 z Metody jako hodnoty lambda-výrazů Jako hodnotu lambda-výrazu lze definovat i existující metodu: Cls ::mtd inst::mtd Cls ::new //printmtd = IO::inform; //printmtd = System.out::println; //factmtd = MyClass::new; Stačí název metody, protože doplnění signatury o typy parametrů vyřeší překladač podle aktuálního kontextu Instanční metoda kvalifikovaná svojí instancí má stejný počet parametrů jako v deklaraci, táž metoda kvalifikovaná třídou své instance má o jeden parametr více počátečním parametrem je její instance = this Speciality: int[]::new označuje jednoparametrický konstruktor, jehož parametrem je délka zkonstruovaného pole; je to ekvivalent lambda-výrazu x > int[x]

31 Copyright Rudolf Pecinovský, Soubor: 09_Lambda_vyrazy.doc, verze , uloženo ne :36 31 z Metoda volající zadanou metodu //Kód ve třídě test\cz.pecinovsky.en_cz.uoa2_j8.aha.lambdademo /*************************************************************************** * Metoda má na starosti provedení zadané akce * spolu s oznámením jejího nastartování a ukončení. * <T> Typ parametru konzumenta description Popis druhu demonstrovaného způsobu definice metody definition Textová podoba definice metody konzumenta consumer Popsaným způsobem definovaný konzument argument Argument konzumenta */ private static <T> void report(string description, String definition, Consumer<T> consumer, T argument) { IO.inform(description + "\n\nbudeme volat metodu definovanou:\n\n" + definition); consumer.accept(argument); IO.inform("Ukončena metoda definovaná:\n\n" + definition);

32 Copyright Rudolf Pecinovský, Soubor: 09_Lambda_vyrazy.doc, verze , uloženo ne :36 32 z Použití metody report( ) //Kód ve třídě public void testconsumers() { String da; //Popis demonstrované akce String dm; //Stringová podoba definice metody Consumer<String> cs; //Konzument textových řetězců Consumer<IPaintable> cp; //Konzument zobrazitelných objektů da = "Přiřazení statické metody lambda-výrazem"; cs = (s) -> IO.inform(s); //Metoda třídy IO dm = "(s) -> IO.inform(s)"; report(da, dm, cs, dm); da = "Přímé přiřazení statické metody"; cs = IO::inform; dm = "IO::inform"; report(da, dm, cs, dm);

33 Copyright Rudolf Pecinovský, Soubor: 09_Lambda_vyrazy.doc, verze , uloženo ne :36 33 z 82 da = "Přiřazení obecné metody instance lambda-výrazem"; cs = (s) -> System.out.println(s); //Metoda instance System.out dm = "(s) -> System.out.println(s)"; report(da, dm, cs, dm); da = "Přímé přiřazení metody konkrétní instance"; cs = System.out::println; dm = "System.out::println"; report(da, dm, cs, dm); CanvasManager CM = CanvasManager.getInstance(); da = "Přiřazení metody konkrétní instance lambda-výrazem"; cp = (p) -> p.show(); dm = "(p) -> p.show()"; report(da, dm, cp, new Rectangle()); da = "Přímé přiřazení metody instance, která vystupuje v roli parametru"; cp = IPaintable::show; dm = "IPaintable::show"; report(da, dm, cp, new Ellipse());

34 Copyright Rudolf Pecinovský, Soubor: 09_Lambda_vyrazy.doc, verze , uloženo ne :36 34 z Světlo s volitelnou žárovkou private <T extends IChangeable & IColorable> Light changeshape(light light, Supplier<T> shapemaker) { Position position = light.getposition(); Size size = light.getsize(); NamedColor color = light.getcolor(); Light result = new Light(position.x, position.y, size.width, color, shapemaker); return public void testbulbshape() { CM.removeAll(); lightxy = changeshape(lightxy, Rectangle::new); lightxyc = changeshape(lightxyc, Triangle::new); lightxys = changeshape(lightxys, () -> new Triangle(0, 0, 1, 1, Direction8.SOUTH_WEST)); CM.add(lightXY, lightxyc, lightxys, lightxysc);

35 Copyright Rudolf Pecinovský, Soubor: 09_Lambda_vyrazy.doc, verze , uloženo ne :36 35 z Využití konstruktoru jako tovární metody Světlo musí být schopno vytvářet své kopie máme dvě možnosti: Budeme chtít, aby tovární metoda vytvářila kopírovatelnou žárovku Využijeme toho, že máme tovární metodu, a použijeme ji při vytváření kopie Zvolíme-li druhou variantu (je jednodušší), vznikne však problém s typem ukládaného objektu (továrny) Překladač neakceptuje deklaraci private final Supplier<T extends IChangeable & IMonocolor> bulbfactory; Akceptuje však žolíkovou variantu: private Supplier<?> bulbfactory; Žolíková varianta sice zkomplikuje zadávání továrního objektu konstruktoru v těle metody copy(), ale to se dá vyřešit přetypováním na surový typ + potlačením vypisování varovných zpráv o vypnutí kontroly typových parametrů v těle této metody

36 Copyright Rudolf Pecinovský, Soubor: 09_Lambda_vyrazy.doc, verze , uloženo ne :36 36 z 82 public Light(int x, int y, int size, NamedColor color) { this(x, y, size, color, Ellipse::new); Pokračování 1/2 public <TC extends IChangeable & IColorable> //Kombinobaný typový parametr Light(int x, int y, int size, NamedColor color, Supplier<TC> bulbfactory) //V parametru obdržíme tovární metodu { TC bulb = bulbfactory.get(); this.color = color; this.bulbfactory = bulbfactory; this.changeablebulb = bulb; this.monocolorbulb = bulb; changeablebulb.setposition(x, y); changeablebulb.setsize(size, size); monocolorbulb.setcolor(color);

37 Copyright Rudolf Pecinovský, Soubor: 09_Lambda_vyrazy.doc, verze , uloženo ne :36 37 z 82 /** Tovární objekt na výrobu žárovek. */ private final public Light copy() { Position position = changeablebulb.getposition(); Light copy = new Light(position.x, position.y, changeablebulb.getsize().width, color, (Supplier)bulbFactory); //Je třeba přetypovat na surový typ return copy; Pokračování 2/2

38 Copyright Rudolf Pecinovský, Soubor: 09_Lambda_vyrazy.doc, verze , uloženo ne :36 38 z Další syntaktická a sémantická pravidla Použití this a super v lambda-výrazech Lambda-výrazy anonymní třídy Lambda-výrazy uzávěry

39 Copyright Rudolf Pecinovský, Soubor: 09_Lambda_vyrazy.doc, verze , uloženo ne :36 39 z Použití this a super v lambda-výrazech Proměnná this použitá v lambda-výrazu se odkazuje na stejnojmenný skrytý parametr instanční metody, v níž je lambda-výraz definován Atribut super použitá v lambda-výrazu se odkazuje na stejnojmenný skrytý atribut instance, v jejíž metodě je lambda-výraz definován V lambda-výrazech definovaných ve vnitřních třídách se tak můžete odvolat na this a super příslušné vnější třídy odpovídající kvalifikací např.: EnclosingClass.this::method nebo EnclosingClass.super::method => lambda-výraz se nemůže odkázat na svůj this ani super

40 Copyright Rudolf Pecinovský, Soubor: 09_Lambda_vyrazy.doc, verze , uloženo ne :36 40 z Lambda-výrazy anonymní třídy Lambda-výrazy je vhodné použít v situacích, v nichž jsme dříve používali anonymní třídy a naopak, instance anonymních tříd lze použít místo lambda-výrazů; přesto to není totéž Na rozdíl od jiných jazyků Java nezavádí speciální typ funkcí (např.: (String, String) int)); místo toho umožňuje uložit lambda-výraz do proměnné, jejímž typem je nějaký funkční interfejs Přetypování na instanci funkčního interfejsu je také to jediné, co můžeme s lambda-výrazem udělat Lambda-výraz nelze uložit do proměnné typu Object, protože třída Object není funkční interfejs; můžeme jej ale uložit po přetypování Object o = (Object)(x -> x+1);

41 Copyright Rudolf Pecinovský, Soubor: 09_Lambda_vyrazy.doc, verze , uloženo ne :36 41 z Lambda-výrazy uzávěry Lambda-výraz má tři komponenty: Parametry Blok kódu Volné proměnné (free variables), což jsou použité lokální proměnné okolního kódu Dvojice [Blok kódu, Volné proměnné] bývá označována jako uzávěr => lambda-výrazy v Javě fungují jako uzávěry

42 Copyright Rudolf Pecinovský, Soubor: 09_Lambda_vyrazy.doc, verze , uloženo ne :36 42 z Nová koncepce konstrukce interface Obsah 3.1 Interfejs a implementace Jednoduchý diamantový problém Složitější diamantový problém Náhled přes konstanty Ukázka implicitní implementace 3.2 Speciální situace a omezení 3.3 Důsledky pro návrh architektury Použití ve standardní knihovně Ukázka použití u funkčních interfejsů 3.4 Statické metody Důsledky pro návrh architektury

43 3.1 Interfejs a implementace Java zavedla konstrukci interface jako programovou reprezentaci rozhraní Jeden z účelů byl obejití problémů při používání násobného dědění Problémy s násobnými rodiči vznikají zejména v souvislosti s násobným děděním implementace Budeme-li dědit pouze rozhraní, tj. pouze sliby, problémy v podstatě odpadají Navíc se ukázalo, že zavedením této konstrukce se otevírá celá řada nových možností v návrhu architektury Autoři některých jazyků následně ukázali, že hlavní příčinou tzv. diamantového problému je v podstatě pouze násobné dědění dat => zakážeme-li dědění dat, problémy nebudou Java proto ve verzi 8 umožňuje v definicích interfejsů uvádět i implicitní implementace metod Copyright Rudolf Pecinovský, Soubor: 09_Lambda_vyrazy.doc, verze , uloženo ne :36 43 z 82

44 Copyright Rudolf Pecinovský, Soubor: 09_Lambda_vyrazy.doc, verze , uloženo ne :36 44 z Jednoduchý diamantový problém Při násobném dědění od společného předka dvou rodičů je třeba určit, jestli se data tohoto předka budou dědit jednou nebo dvakrát

45 3.1.2 Složitější diamantový problém Copyright Rudolf Pecinovský, Soubor: 09_Lambda_vyrazy.doc, verze , uloženo ne :36 45 z 82

46 Copyright Rudolf Pecinovský, Soubor: 09_Lambda_vyrazy.doc, verze , uloženo ne :36 46 z Náhled přes konstanty Java umožňuje definovat v interfejsu statické konstanty Tyto konstanty nepředstavují konkrétní uložená data, jsou to především názvy, za něž se dosazují konkrétní hodnoty S nástupem lambda-výrazů lze do těchto konstant přiřazovat i kód Vzhledem k tomu, že metoda je pouze jinak zapsaný konstantní lambda-výraz, je jenom logické, že v Javě 8 lze v interfejsu definovat i metody Instanční metody s definovaným tělem se v Javě označují modifikátorem default, třídní metody se stejně jako ve třídách označují modifikátorem static Implicitní verze metod nesmí přebíjet žádnou metodu předka

47 Copyright Rudolf Pecinovský, Soubor: 09_Lambda_vyrazy.doc, verze , uloženo ne :36 47 z Ukázka implicitní implementace Definujeme metody, které by asi všichni definovali stejně public interface IMovable extends IPaintable { public Position getposition(); public void setposition(int x, int y); public default void setposition(position position) { setposition(position.x, position.y);

48 3.2 Speciální situace a omezení Objeví-li se ve stromu dědičnosti více metod se stejnou signaturou, platí následující pravidla: 1. Třída vždy vyhrává. Definuje-li rodičovská třída metodu se stejnou signaturou, jakou má implicitně definovaná metoda implementovaného interfejsu, metoda interfejsu je ignorována 2. Definují-li dva implementované interfejsy metody se shodnou signaturou, musí implementující třída vyřešit konflikt tím, že definuje vlastní verzi této metody, která přebije verze zděděné od implementovaných interfejsů, a to nezávisle na tom, jestli některá z nich (či obě) má implicitní definici. (Jinými slovy: třída se chová stejně jako před Javou 8.) Z předchozího vyplývá, že nemá smysl, aby interfejs definoval implicitní verze metod zděděných od Object, a proto tyto metody ani přebít nesmí Interfejs však může přebít implicitní metodu svého předka Interfejs nyní může obsahovat metodu main a vystupovat tak v roli hlavní třídy aplikace Copyright Rudolf Pecinovský, Soubor: 09_Lambda_vyrazy.doc, verze , uloženo ne :36 48 z 82

49 Copyright Rudolf Pecinovský, Soubor: 09_Lambda_vyrazy.doc, verze , uloženo ne :36 49 z Důsledky pro návrh architektury Při používání klasicky navrženého interfejsu jsme museli tento interfejs velmi pečlivě navrhnout, protože jakékoliv další úpravy publikovaného interfejsu jsou zakázané Při povolení implicitních implementací deklarovaných metod můžeme dodatečně rozšiřovat funkcionalitu tříd implementujících dané interfejsy, aniž bychom museli měnit jejich kód Zavedení interfejsů s implicitní implementací nahrazuje v některých případech použití některých návrhových vzorů V řadě případů umožňuje obejít návrhový vzor Adapter (např. při návrhu posluchačů v java.awt) V dalších případech umožňuje se obejít bez použití návrhového vzoru Návštěvník (Visitor)

50 Copyright Rudolf Pecinovský, Soubor: 09_Lambda_vyrazy.doc, verze , uloženo ne :36 50 z Použití ve standardní knihovně Převážná většina interfejsů používá implicitní implementaci, v mnohých je implementovaných metod víc než těch abstraktních public interface Iterable<T> { Iterator<T> iterator(); default void foreach(consumer<? super T> action) { Objects.requireNonNull(action); for (T t : this) { action.accept(t); default Spliterator<T> spliterator() { return Spliterators.spliteratorUnknownSize(iterator(), 0);

51 Copyright Rudolf Pecinovský, Soubor: 09_Lambda_vyrazy.doc, verze , uloženo ne :36 51 z Ukázka použití u funkčních public interface BiFunction<T, U, R> { //Povinná abstraktní metoda R apply(t t, U u); //Metoda s implicitní definicí rozšiřující funkcionalitu definovaného typu //Parametrem je funkce, akceptující jako parametr návratový typ //abstraktní metody definovaného funkčního typu default <V> BiFunction<T, U, V> andthen(function<? super R,? extends V> after) { Objects.requireNonNull(after); return (T t, U u) -> after.apply(apply(t, u));

52 Copyright Rudolf Pecinovský, Soubor: 09_Lambda_vyrazy.doc, verze , uloženo ne :36 52 z Statické metody Java 8 dovoluje v interfejsu definovat statické public interface BinaryOperator<T> extends BiFunction<T,T,T> { //Vrátí operátor vracející komparátorem určenou menší ze zadaných hodnot public static <T> BinaryOperator<T> minby(comparator<? super T> comparator) { Objects.requireNonNull(comparator); return (a, b) -> comparator.compare(a, b) <= 0? a : b; //Vrátí operátor vracející komparátorem určenou větší ze zadaných hodnot public static <T> BinaryOperator<T> maxby(comparator<? super T> comparator) { Objects.requireNonNull(comparator); return (a, b) -> comparator.compare(a, b) >= 0? a : b;

53 Copyright Rudolf Pecinovský, Soubor: 09_Lambda_vyrazy.doc, verze , uloženo ne :36 53 z public interface Function<T, R> { R apply(t t); default <V> Function<V, R> compose(function<? super V,? extends T> before) { Objects.requireNonNull(before); return (V v) -> apply(before.apply(v)); default <V> Function<T, V> andthen(function<? super R,? extends V> after) { Objects.requireNonNull(after); return (T t) -> after.apply(apply(t)); static <T> Function<T, T> identity() { return t -> t;

54 3.4.1 Důsledky pro návrh architektury Možnost definovat statické metody v interfejsech osvobozuje od nutnosti definovat knihovní třídy pro skupiny tříd implementujících daný interfejs Např. řadu metod třídy Collections by bylo možno definovat jako statické metody interfejsu Collection Mnohé z knihovních metod by navíc bylo lze definovat jako instanční (např. shuffle(list), sort(list) apod.) Copyright Rudolf Pecinovský, Soubor: 09_Lambda_vyrazy.doc, verze , uloženo ne :36 54 z 82

55 Copyright Rudolf Pecinovský, Soubor: 09_Lambda_vyrazy.doc, verze , uloženo ne :36 55 z Datový typ java.util.optional<t> Obsah 4.1 Základní princip 4.2 Ekvivalenty jednoduchých operací 4.3 Získání prvotní hodnoty 4.4 Definované metody

56 4.1 Základní princip Velmi často pracujeme s proměnnými, jejichž hodnotou může být prázdný odkaz null; kód pak bývá prokládán neustálými testy na nullovost proměnné Některé jazyky řeší tento problém zavedením speciálních operátorů Groovy safe navigation operator (Elvis operator)?. (x?. y) == ((x == null)? null : x.y) Java nezavádí nový operátor, ale místo toho rozšiřuje knihovnu o generický datový typ Optional<T> Výhodou je, že takovýto typ bylo možno dodefinovat i ve starších verzích, takže pokud někdo používal něco obdobného, nebude muset měnit zvyky Další výhodou je to, že takto můžeme pro takto definované objekty definovat celou řadu pomocných služebních metod a k nim i několik továrních metod Copyright Rudolf Pecinovský, Soubor: 09_Lambda_vyrazy.doc, verze , uloženo ne :36 56 z 82

57 Copyright Rudolf Pecinovský, Soubor: 09_Lambda_vyrazy.doc, verze , uloženo ne :36 57 z Ekvivalenty jednoduchých operací Použití hodnoty Optional<T> optional = something; optional.get().method(); je ekvivalentní klasickému T object = something. object.method() Jediným rozdílem je, že v typu vyhozené výjimky v prvním případě bude vyhozena NoSuchElementException, v druhém NullPointerException Opatrné použití hodnoty if (optional.ispresent()) { optional.get().method(); je pouze komplikovanější variantou klasického if (object!= null) { object.method();

58 Copyright Rudolf Pecinovský, Soubor: 09_Lambda_vyrazy.doc, verze , uloženo ne :36 58 z Získání prvotní hodnoty public static <T> Optional<T> empty() Získání prázdné hodnoty public static <T> Optional<T> of(t value) Získání instance obalující zadanou nenullovou hodnotu; je-li parametr null, vyhodí NullPointerException public static <T> Optional<T> ofnullable(t value) Získání instance obalující zadanou hodnotu; je-li parametr null, vrátí Optional<T>.empty()

59 Copyright Rudolf Pecinovský, Soubor: 09_Lambda_vyrazy.doc, verze , uloženo ne :36 59 z Definované metody Podmíněné volání metody public void ifpresent(consumer<? super T> consumer) optional.ifpresent(consumer); je ekvivalentní klasickému if (value!= null) { consumer.accept(value); Filtrování hodnoty public Optional<T> filter(predicate<? super T> predicate) optional = optional.filter(predicate); je ekvivalentní klasickému optional = (optional.ispresent)? (predicate(optional.get())? optional : Optional<T>.empty() : optional;

60 Copyright Rudolf Pecinovský, Soubor: 09_Lambda_vyrazy.doc, verze , uloženo ne :36 60 z 82 Mapování hodnoty na hodnotu public <U> Optional<U> map(function<? super T,? extends U> mapper) newoptional = optional.map(mapper); je ekvivalentní klasickému newoptional = optional.ispresent()? Optional<U>.ofNullable(mapper.apply(optional.get())) : Optional.empty(); Oproti filtru se zde vyrábí nová instance pomocí empty() Zplošťující mapování na hodnotu (aby nevznikl Optional<Optional<T>> public<u>optional<u> flatmap(function<? super T,Optional<U>> mapper) newoptional = optional.flatmap(mapper); je ekvivalentní klasickému newoptional = optional.ispresent()? Objects<U>.requireNonNull(mapper.apply(optional.get())) : Optional.empty(); Metoda mapper(optional<t>) musí vrátit nenullový Optional<U>

61 Copyright Rudolf Pecinovský, Soubor: 09_Lambda_vyrazy.doc, verze , uloženo ne :36 61 z 82 Přiřazení implicitní hodnoty v případě nullovosti odkazu public T orelse(t other) value = optional.orelse(other); je ekvivalentní klasickému value = optional.ispresent()? optional.get() : other; //neboli value = (ovalue!= null)? ovalue : other; Přiřazení spočtené hodnoty v případě nullovosti odkazu public T orelseget(supplier<? extends T> other) value = optional.orelseget(other); je ekvivalentní klasickému value = optional.ispresent()? optional.get() : other.get(); //neboli value = (ovalue!= null)? ovalue : other.get();

62 Copyright Rudolf Pecinovský, Soubor: 09_Lambda_vyrazy.doc, verze , uloženo ne :36 62 z Rozšířená verze předchozího příkladu Umožníme zastavení zastaveného blikání private Optional<Repeater> repeater = Optional.empty(); //** Zjistí, jestli dané světlo právě bliká. */ public boolean isblinking() { return repeater!= null; /** Ukončí blikání a zapomene odkaz na opakovač. */ public void stopblinking() { Optional<Repeater> assert (repeater!= null) : "Pokus o ukončení neexistujícího blikání"; repeater.stop(); repeater = null; /**Požadovaný poček krát světlem blikne nezávisle na činnosti zbytku programu. * Nula krát znamená pořád, dokud nezavoláme stopblinking(). */ public void blink(int times, int period) { blink(times, period, () -> {);

63 Copyright Rudolf Pecinovský, Soubor: 09_Lambda_vyrazy.doc, verze , uloženo ne :36 63 z 82 /**Požadovaný poček krát světlem blikne nezávisla na činnosti zbytku programu, * Přičemž po ukončení blikání zavolá zadanou metodu. * Nula krát znamená pořád, dokud nezavoláme stopblinking(). */ public void blink(int times, int period, Runnable finished) { assert isblinking() : "Blikání bylo spuštěno před ukončením předchozího"; repeater = new Repeater(); Runnable action = () -> { switchon(); IO.pause(period/2); switchoff(); IO.pause(period/2); ; Runnable blinkingfinished = () -> { repeater = null; finished.run(); ; repeater.repeat(times, action, blinkingfinished);

64 Copyright Rudolf Pecinovský, Soubor: 09_Lambda_vyrazy.doc, verze , uloženo ne :36 64 z Datovody Obsah 5.1 Seznámení Motivace Obecná charakteristika Terminologie Změna používaných iterátorů Analogie s výrobní linkou Odchylky od kolekcí a polí Typy operací s daty v proudu: Vztah operací k proudům 5.2 Operace s daty v proudu Ukázka Filtrování obsahu proudu Řazení objektů v proudu Konverze prvků v proudu 5.3 Možnosti získání proudu Tovární metody pro generování proudů

65 5.1 Seznámení Motivace Klasický postup: Opakovaně prováděj: požádej kontejner o další uloženou instance, zjisti, jestli patří mezi ty, které je třeba zpracovat, pokud ano tak instanci požadovaným způsobem zpracuj Nevýhody: Zbytečně se opakuje podobný kód V programu zpracovává jedna položka po druhé Trend: posilovat deklarativní přístup k programování Snaha moci vysvětlit co se má dělat a nechat na knihovně jak to udělá Umožníme tím specialistům navrhujícím knihovny optimalizovat řešení např. pro intenzivní využití paralelismu Copyright Rudolf Pecinovský, Soubor: 09_Lambda_vyrazy.doc, verze , uloženo ne :36 65 z 82

66 5.1.2 Obecná charakteristika Knihovny kolekcí a polí jsou staré a těžko modifikovatelné => Snaha použít jiné přístupy známé z funkcionálního programování Ve FP jsou proudy chápány jako univerzální posloupnosti postupně zpřístupňovaných dat Java 8: Proud je klíčová abstrakce pro zpracování skupin dat umožňující specifikovat, co se má s daty dělat, a abstrahovat od toho, jak se to bude dělat Většina metod proudů čte data proudu a vrací proud obsahující data příslušné (před)zpracovaná Ukázka sečti váhy červených udělátek v kolekci widgets int sum = widgets.stream().filter(b -> b.getcolor() == RED).mapToInt(b -> b.getweight()).sum(); Copyright Rudolf Pecinovský, Soubor: 09_Lambda_vyrazy.doc, verze , uloženo ne :36 66 z 82

67 Copyright Rudolf Pecinovský, Soubor: 09_Lambda_vyrazy.doc, verze , uloženo ne :36 67 z Terminologie V OOP jsou pod termínem proud často chápány objekty zprostředkovávající přenos dat od zdroje k cíli Datové proudy jsou pak většinou spojovány přenosem dat od zdroje k cíli, přičemž zdrojem či cílem může být program, soubor, datovod (pipe), oblast paměti, objekt, Ve standardní knihovně Javy jsou takto pojímané proudy definovány jako potomci abstraktních tříd InputStream, OutputStream, Reader a Writer Funkcionální programování však tento termín používá pro potenciálně nekonečné seznamy, které však data neuchovávají, ale pouze o nich ví. Program definuje, jaká data se do proudu zařadí, resp. jak proud ona data získá Nezávisle na tom se definuje, co se těmito daty bude dělat Proudy jsou ve své přirozenosti funkcionální, takže nemění data umístěná v proudu každé dato je za života proudu navštíveno jen jednou Většina operací je implementována jako odložené (lazy)

68 5.1.4 Změna používaných iterátorů Při práci s klasickými poli a kolekcemi se používají především externí (sekvenční) iterátory Program požádá kolekci o iterátor, který pak v cyklu žádá o další instanci, s níž provede požadovanou operaci Proud se chová jako objekt využívající interní (dávkové) iterátory provádějící s iterovanými objekty operace definované lambda-výrazy Výhody: Z programu zmizí pomocný kód, který měl na starosti řízení iterací, (tj. popis jak to dělat) a zpřehlední se tak popis akcí, které budou popisovat, co se zpracovávanými objekty udělat Objeví-li se v budoucnu nějaké propracovanější techniky paralelizace prováděných činností, není třeba upravovat část programu řešící aplikační logiku, ale stačí pouze vylepšit knihovnu proudů a tím se automaticky zefektivní zpracování programů, které tyto proudy využívají Copyright Rudolf Pecinovský, Soubor: 09_Lambda_vyrazy.doc, verze , uloženo ne :36 68 z 82

69 Copyright Rudolf Pecinovský, Soubor: 09_Lambda_vyrazy.doc, verze , uloženo ne :36 69 z Analogie s výrobní linkou Na počátku je vstup V případě výrobního pásu je to sklad dílů, nebo nějak zabezpečený přísun vstupních surovin od dodavatele V případě proudu to bude zdroj dat většinou nějaký zdrojový kontejner, zdrojem ale může být i generátor, který vytváří data na požádání Pracoviště Podél výrobního pásu jsou připravená pracoviště, na nichž zaškolení dělníci provádějí jednotlivé operace V případě proudu nahradíme dělníky metodami (přesněji lambda výrazy), které s přišedším objektem provedou požadovanou operaci a vypustí jej do dalšího proudu, kde pokračuje k dalšímu pracovišti Výsledky Na konci výrobního pásu vypadne hotový výrobek Na konci série operací s daty v proudu obdržíme (doufejme ) požadovaný výsledek

70 Copyright Rudolf Pecinovský, Soubor: 09_Lambda_vyrazy.doc, verze , uloženo ne :36 70 z Odchylky od kolekcí a polí Proudy si neblokují žádnou paměť pro zpracovávaná data; data od někud přitékají, pracoviště je zpracuje a pošle dál Ve většině případů zpracování neovlivňuje zdrojová data Důležité při hromadném zpracování dat několika procesory, protože pak se můžeme na jejich hodnoty spolehnout Naplánované průběžné operace se chovají obdobně jako dělníci u pásu: Nehrnou se do skladu (kontejneru), aby v něm data zpracovaly, ale: 1. Počkají si, až k nim zpracovávaný objekt po vstupním proudu přiteče 2. Přišedší objekt zpracují 3. Zpracovaný objekt vloží do výstupního proudu a vrátí odkaz na tento proud

71 5.1.7 Typy operací s daty v proudu: Filtrace Např. při procházení souborů na disku mne zajímají jen ty s danou příponou Mapování (konverze) Z přišedšího objektu mne zajímá jen hodnota jednoho atributu do výstupního proudu odchází ona Řazení Pro další zpracování potřebuji mít data definovaným způsobem seřazena Souhrny (reduction, folding) Na přitékajících datech mne zajímá pouze nějaká souhrnná informace průměr, součet, Sdružování (mutable reduction) Zpracovaná data vkládám do nějakého kontejneru (kolekce, pole, ) Copyright Rudolf Pecinovský, Soubor: 09_Lambda_vyrazy.doc, verze , uloženo ne :36 71 z 82

72 5.1.8 Vztah operací k proudům Vrácený proud nemusí být shodný se vstupním Když má operace např. zjistit počet znaků v řetězci, je vstupním proudem proud textových řetězců (stringů) a výstupním proudem proud celých čísel V případě potřeby může mít výstupní proud jinak uspořádaná data než proud vstupní Operace nejsou nijak ovlivněny tím, zda je vstup dat konečný (klasický kontejner), nebo nekonečný Data prostě přitékají a co přiteče, to se zpracuje, a čeká se na další Operace nejsou svázány s konkrétním proudem; program může postupně vytvářet různé proudy, na jejichž data pošle danou sadu operací Jednou může být zdrojem dat kolekce, jindy generátor apod. Operace pouze vědí, že data přijdou, ony je mají zpracovat a někam poslat Copyright Rudolf Pecinovský, Soubor: 09_Lambda_vyrazy.doc, verze , uloženo ne :36 72 z 82

73 5.2 Operace s daty v proudu Průběžné (intermediate) Převezmou objekt, zpracují jej a pošlou dále po proudu, případně je předají do jiného proudu Vracejí proud, takže je lze jednoduše zřetězit Nemusejí vždy vracet svůj proud, ale mohou vracet i jiný => nelze obecně zavolat průběžnou metodu, aniž bychom si zapamatovali proud, který nám vrátí a jehož metodu pak musíme v dalším kroku oslovit Koncové (terminal) Zakončují činnost proudu a předávají výsledek okolnímu programu Výstupní hodnotou může být kolekce, objekt, ale také nic Copyright Rudolf Pecinovský, Soubor: 09_Lambda_vyrazy.doc, verze , uloženo ne :36 73 z 82

74 Copyright Rudolf Pecinovský, Soubor: 09_Lambda_vyrazy.doc, verze , uloženo ne :36 74 z Ukázka /*************************************************************************** * Zabezpečí, aby každé světlo na zhaslo, bliklo a opět se rozsvítilo. * To, jestli budou světla pracovat postupně nebo všechna najednou, * záleží na typu proudu. */ private void streamblink(stream<light> stream, String text) { //Akci, kterou budu chtít zadat vícekrát, si připravím a uložím Consumer<Light> pause = (o)->io.pause(500); //Zapamatuje si proud vrácený poslední průběžnou operací stream = stream //Diktuji operace, které se budou v proudu postupně provádět.peek(light::switchoff).peek(pause).peek(light::blink).peek(pause).peek(light::switchon); //Zatím se nic nedělo, dít se začne až při provádění terminální akce long count = stream.count(); IO.inform(text + "\n\nblikalo: " + count);

Lambda-výrazy a metody implementované v interfejsu

Lambda-výrazy a metody implementované v interfejsu Copyright Rudolf Pecinovský, Soubor: 09_Lambda_vyrazy.doc, verze 1.00.2413, uloženo po 10.11.2014 16:32 1 z 54 Lambda-výrazy a metody implementované v interfejsu Pecinovský rudolf@pecinovsky.cz Copyright

Více

Trendy v návrhu SW architektury

Trendy v návrhu SW architektury Copyright Rudolf Pecinovský, Soubor: PR_Funkcionalni_konstrukce_v_Jave_8.doc, verze 1.00.2413, uloženo út 4.2.2014 07:22 1 z 71 Trendy v návrhu SW architektury Pecinovský rudolf@pecinovsky.cz Copyright

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

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

Copyright Rudolf Pecinovský, Soubor: 11_Kontejnery a datovody.doc, verze 1.00.2413, uloženo st 10.12.2014 10:33 1 z 43. Kontejnery a datovody

Copyright Rudolf Pecinovský, Soubor: 11_Kontejnery a datovody.doc, verze 1.00.2413, uloženo st 10.12.2014 10:33 1 z 43. Kontejnery a datovody Copyright Rudolf Pecinovský, Soubor: 11_Kontejnery a datovody.doc, verze 1.00.2413, uloženo st 10.12.2014 10:33 1 z 43 Kontejnery a datovody Obsah Copyright Rudolf Pecinovský, Soubor: 11_Kontejnery a datovody.doc,

Více

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

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

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

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

Teoretické minimum z PJV

Teoretické minimum z PJV Teoretické minimum z PJV Pozn.: následující text popisuje vlastnosti jazyka Java zjednodušeně pouze pro potřeby výuky. Třída Zavádí se v programu deklarací třídy což je část programu od klíčových slov

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

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

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

Třídy. Instance. Pokud tento program spustíme, vypíše následující. car1 má barvu Red. car2 má barvu Red. car1 má barvu Blue.

Třídy. Instance. Pokud tento program spustíme, vypíše následující. car1 má barvu Red. car2 má barvu Red. car1 má barvu Blue. 23. Třídy, generické třídy, instance, skládání, statické metody a proměnné. Zapouzdření, konstruktory, konzistence objektu, zpřístupnění vnitřní implementace, modifikátory public a private. Polymorfismus,

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

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

Ú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

Vaše jistota na trhu IT. Balíčky. Rudolf Pecinovský rudolf@pecinovsky.cz

Vaše jistota na trhu IT. Balíčky. Rudolf Pecinovský rudolf@pecinovsky.cz Vaše jistota na trhu IT Balíčky Rudolf Pecinovský rudolf@pecinovsky.cz Problémy velkých aplikací Rozsáhlé aplikace používají velké množství názvů objektů a jejich zpráv, které různé části programu sdílí

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

Polymorfismus. Časová náročnost lekce: 3 hodiny Datum ukončení a splnění lekce: 30.března

Polymorfismus. Časová náročnost lekce: 3 hodiny Datum ukončení a splnění lekce: 30.března Polymorfismus Cíle lekce Cílem lekce je vysvětlit význam pojmu polymorfismus jako základní vlastnosti objektově orientovaného programování. Lekce objasňuje vztah časné a pozdní vazby a jejich využití.

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

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

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

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

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

Obsah. Předmluva 13 Zpětná vazba od čtenářů 14 Zdrojové kódy ke knize 15 Errata 15

Obsah. Předmluva 13 Zpětná vazba od čtenářů 14 Zdrojové kódy ke knize 15 Errata 15 Předmluva 13 Zpětná vazba od čtenářů 14 Zdrojové kódy ke knize 15 Errata 15 KAPITOLA 1 Úvod do programo vání v jazyce C++ 17 Základní pojmy 17 Proměnné a konstanty 18 Typy příkazů 18 IDE integrované vývojové

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

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

Ú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

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

Ú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

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

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

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

Virtuální metody - polymorfizmus

Virtuální metody - polymorfizmus - polymorfizmus - potomka lze použít v místě, kde je možné použít předka - v dosud probraných situacích byly vždy volány funkce, které jsou známy již v době překladu. V situaci, kdy v době překladu není

Více

Objektové programování

Objektové programování Objektové programování - přináší nové možnosti a styl programování - vytváří nový datový typ, který umí vše co standardní datové typy + to co ho naučíme - překladač se k tomuto typu chová stejně jako k

Více

Předmluva k aktuálnímu vydání Úvod k prvnímu vydání z roku Typografické a syntaktické konvence... 20

Předmluva k aktuálnímu vydání Úvod k prvnímu vydání z roku Typografické a syntaktické konvence... 20 Obsah 5 Obsah Předmluva k aktuálnímu vydání 15 1 Úvod k prvnímu vydání z roku 2000 16 Typografické a syntaktické konvence................ 20 2 Základní pojmy 21 2.1 Trocha historie nikoho nezabije................

Více

ČÁST 1. Zahřívací kolo. Co je a k čemu je návrhový vzor 33

ČÁST 1. Zahřívací kolo. Co je a k čemu je návrhový vzor 33 Stručný obsah Část 1: Zahřívací kolo Kapitola 1 Co je a k čemu je návrhový vzor 33 Kapitola 2 Zásady objektově orientovaného programování 39 Kapitola 3 Co konstruktor neumí (Jednoduchá tovární metoda Simple

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

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

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

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

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

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

PB161 Programování v jazyce C++ Přednáška 9 PB161 Programování v jazyce C++ Přednáška 9 Právo friend Přetěžování operátorů Nikola Beneš 16. listopadu 2015 PB161 přednáška 9: friend, přetěžování operátorů 16. listopadu 2015 1 / 30 Reklama PB173 Tematicky

Více

Programování II. Polymorfismus

Programování II. Polymorfismus Programování II Polymorfismus Osnova přednášky Vztah přetížení, překrytí a protected přístupu. Co je polymorfismus? Příklad. Přetížení, překrytí, protected Přetížení x překrytí Přetížením řešíme doplnění

Více

Obsah. Úvod 11 Základy programování 11 Objektový přístup 11 Procvičování 11 Zvláštní odstavce 12 Zpětná vazba od čtenářů 12 Errata 13

Obsah. Úvod 11 Základy programování 11 Objektový přístup 11 Procvičování 11 Zvláštní odstavce 12 Zpětná vazba od čtenářů 12 Errata 13 Úvod 11 Základy programování 11 Objektový přístup 11 Procvičování 11 Zvláštní odstavce 12 Zpětná vazba od čtenářů 12 Errata 13 KAPITOLA 1 Na úvod o Javě 15 Počítačový program 15 Vysokoúrovňový programovací

Více

Copyright Rudolf Pecinovský, Soubor: 02_Rozhraní x Interfejs.doc, verze 1.00.2413, uloženo čt 9.10.2014 12:44 1z 55. Rozhraní. interface (interfejs)

Copyright Rudolf Pecinovský, Soubor: 02_Rozhraní x Interfejs.doc, verze 1.00.2413, uloženo čt 9.10.2014 12:44 1z 55. Rozhraní. interface (interfejs) Copyright Rudolf Pecinovský, Soubor: 02_Rozhraní x Interfejs.doc, verze 1.00.2413, uloženo čt 9.10.2014 12:44 1z 55 Rozhraní interface (interfejs) Obsah Copyright Rudolf Pecinovský, Soubor: 02_Rozhraní

Více

Počítačové laboratoře bez tajemství aneb naučme se učit algoritmizaci a programování s využitím robotů CZ.1.07/1.3.12/04.0006

Počítačové laboratoře bez tajemství aneb naučme se učit algoritmizaci a programování s využitím robotů CZ.1.07/1.3.12/04.0006 Počítačové laboratoře bez tajemství aneb naučme se učit algoritmizaci a programování s využitím robotů CZ.1.07/1.3.12/04.0006 Lekce 1 Jazyk Java Tento projekt je spolufinancován Evropským sociálním fondem

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

4. ZÁKLADNÍ POJMY Z OBJEKTOVĚ ORIENTOVANÉHO PROGRAMOVÁNÍ

4. ZÁKLADNÍ POJMY Z OBJEKTOVĚ ORIENTOVANÉHO PROGRAMOVÁNÍ 4. ZÁKLADNÍ POJMY Z OBJEKTOVĚ ORIENTOVANÉHO PROGRAMOVÁNÍ OBJEKT Program v Javě je staticky strukturován na třídy, jejichž instance (objekty) za běhu dynamicky programu vznikají a zanikají. Objekt je nejprve

Více

PREPROCESOR POKRAČOVÁNÍ

PREPROCESOR POKRAČOVÁNÍ PREPROCESOR POKRAČOVÁNÍ Chybová hlášení V C# podobně jako v C++ existuje direktiva #error, která způsobí vypsání chybového hlášení překladačem a zastavení překladu. jazyk C# navíc nabízí direktivu #warning,

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

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

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

Programování v Javě I. Leden 2008

Programování v Javě I. Leden 2008 Seminář Java Programování v Javě I Radek Kočí Fakulta informačních technologií VUT Leden 2008 Radek Kočí Seminář Java Programování v Javě (1) 1/ 45 Téma přednášky Datové typy Deklarace třídy Modifikátory

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

NPRG031 Programování II 1 / :25:46

NPRG031 Programování II 1 / :25:46 NPRG031 Programování II 1 / 26 28. 2. 2018 11:25:46 Objekty Svět se skládá z objektů! konkrétní x abstraktní hmatatelné x nehmatatelné (letadlo) x (chyba v programu) Objekty mohou obsahovat jiné objekty

Více

NMIN201 Objektově orientované programování 1 / :36:09

NMIN201 Objektově orientované programování 1 / :36:09 NMIN201 Objektově orientované programování 1 / 26 8.10.2013 15:36:09 Objekty Svět se skládá z objektů! konkrétní x abstraktní hmatatelné x nehmatatelné (letadlo) x (chyba v programu) Objekty mohou obsahovat

Více

Algoritmizace a programování

Algoritmizace a programování Algoritmizace a programování Výrazy Operátory Výrazy Verze pro akademický rok 2012/2013 1 Operace, operátory Unární jeden operand, operátor se zapisuje ve většině případů před operand, v některých případech

Více

3. Třídy. Základní pojmy objektového programování. Třídy

3. Třídy. Základní pojmy objektového programování. Třídy 3. Třídy Základní pojmy objektového programování Jak už víme, je Java objektovým programovacím jazykem. V úvodu této kapitoly si objasníme základní pojmy objektové teorie. Objekt představuje souhrn dat

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

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

Programování v Javě I. Únor 2009

Programování v Javě I. Únor 2009 Seminář Java Programování v Javě I Radek Kočí Fakulta informačních technologií VUT Únor 2009 Radek Kočí Seminář Java Programování v Javě (1) 1/ 44 Téma přednášky Datové typy Deklarace třídy Modifikátory

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

Jazyk C++ I. Polymorfismus

Jazyk C++ I. Polymorfismus Jazyk C++ I Polymorfismus AR 2013/2014 Jazyk C++ I Úvod Metody s časnou vazbou jsou překládány jako obyčejné céčkovské funkce. Této metodě je předán jako první implicitní parametr this. Rozdíl mezi obyčejnou

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

Jazyk C++ I. Polymorfismus

Jazyk C++ I. Polymorfismus Jazyk C++ I Polymorfismus AR 2013/2014 Jazyk C++ I Operátory Co to vůbec jsou operátory? Na co je používáme? AR 2013/2014 Jazyk C++ I 2 Operátory Můžeme si upravit operátory pro vlastní objektové typy?

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

Objekty v PHP 5.x. This is an object-oriented system. If we change anything, the users object.

Objekty v PHP 5.x. This is an object-oriented system. If we change anything, the users object. Objekty v PHP 5.x This is an object-oriented system. If we change anything, the users object. Objektové PHP Objekty se poprvé objevili v PHP ve verzi 4. Nepříliš zdařilý pokus. Programátoři získali nedůvěru

Více

Návrhové vzory OMO, LS 2014/2015

Návrhové vzory OMO, LS 2014/2015 Návrhové vzory OMO, LS 2014/2015 Motivace Cílem objektového návrhu je strukturu aplikace navrhnout tak, aby splňovala následující kritéria: snadná rozšiřitelnost účelnost testovatelnost dokumentovatelnost

Více

Programování v C++ 1, 6. cvičení

Programování v C++ 1, 6. cvičení Programování v C++ 1, 6. cvičení dědičnost, polymorfismus 1 1 Fakulta jaderná a fyzikálně inženýrská České vysoké učení technické v Praze Zimní semestr 2018/2019 Přehled 1 2 3 Shrnutí minule procvičené

Více

III/2 Inovace a zkvalitnění výuky prostřednictvím ICT

III/2 Inovace a zkvalitnění výuky prostřednictvím ICT Číslo a název šablony Číslo didaktického materiálu Druh didaktického materiálu Autor Jazyk Téma sady didaktických materiálů Téma didaktického materiálu Vyučovací předmět Cílová skupina (ročník) Úroveň

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

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

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

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

Quo vadis programování? Automatizace vyhodnocování studentských úloh

Quo vadis programování? Automatizace vyhodnocování studentských úloh Vaše jistota na trhu IT Quo vadis programování? Automatizace vyhodnocování studentských úloh Rudolf PECINOVSKÝ rudolf@pecinovsky.cz Vladimír Oraný vladimir.orany@gmail.com Vaše jistota na trhu IT Obsah

Více

Ukazatel (Pointer) jako datový typ - proměnné jsou umístěny v paměti na určitém místě (adrese) a zabírají určitý prostor (počet bytů), který je daný

Ukazatel (Pointer) jako datový typ - proměnné jsou umístěny v paměti na určitém místě (adrese) a zabírají určitý prostor (počet bytů), který je daný Ukazatel (Pointer) jako datový typ - proměnné jsou umístěny v paměti na určitém místě (adrese) a zabírají určitý prostor (počet bytů), který je daný typem proměnné - ukazatel je tedy adresa společně s

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

Principy objektově orientovaného programování

Principy objektově orientovaného programování Principy objektově orientovaného programování Třídy a objekty 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 C E T

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

Více o konstruktorech a destruktorech

Více o konstruktorech a destruktorech Více o konstruktorech a destruktorech Více o konstruktorech a o přiřazení... inicializovat objekt lze i pomocí jiného objektu lze provést přiřazení mezi objekty v původním C nebylo možné provést přiřazení

Více

Seminář Java II p.1/43

Seminář Java II p.1/43 Seminář Java II Seminář Java II p.1/43 Rekapitulace Java je case sensitive Zdrojový kód (soubor.java) obsahuje jednu veřejnou třídu Třídy jsou organizovány do balíků Hierarchie balíků odpovídá hierarchii

Více

Programování v C++ 1, 5. cvičení

Programování v C++ 1, 5. cvičení Programování v C++ 1, 5. cvičení konstruktory, nevirtuální dědění 1 1 Fakulta jaderná a fyzikálně inženýrská České vysoké učení technické v Praze Zimní semestr 2018/2019 Přehled 1 2 3 Shrnutí minule procvičené

Více

Operátory, výrazy. Tomáš Pitner, upravil Marek Šabo

Operátory, výrazy. Tomáš Pitner, upravil Marek Šabo Operátory, výrazy Tomáš Pitner, upravil Marek Šabo Operátor "Znaménko operace", pokyn pro vykonání operace při vyhodnocení výrazu. V Javě mají operátory napevno daný význam, nelze je přetěžovat jako v

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

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

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

Chování konstruktorů a destruktorů při dědění

Chování konstruktorů a destruktorů při dědění Dědičnost V objektově orientovaném programování je dědičnost způsob, jak vytvořit novou třídu použitím již existujících definic jiných tříd. Takto vytvořené třídy přebírají vlastnosti a metody svého předka

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

Paměť počítače. alg2 1

Paměť počítače. alg2 1 Paměť počítače Výpočetní proces je posloupnost akcí nad daty uloženými v paměti počítače Data jsou v paměti reprezentována posloupnostmi bitů (bit = 0 nebo 1) Připomeňme: paměť je tvořena řadou 8-mi bitových

Více

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

PB161 Programování v jazyce C++ Přednáška 4 PB161 Programování v jazyce C++ Přednáška 4 Přetěžování funkcí Konstruktory a destruktory Nikola Beneš 9. října 2017 PB161 přednáška 4: přetěžování funkcí, konstruktory, destruktory 9. října 2017 1 / 20

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

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

Metodika. Architecture First. Rudolf Pecinovský rudolf@pecinovsky.cz

Metodika. Architecture First. Rudolf Pecinovský rudolf@pecinovsky.cz Copyright Rudolf Pecinovský, Soubor: 2014_Comm_PrW_Architecture First Methodology.doc, verze 1.00.2413, uloženo po 9.6.2014 14:43 1 z 39 Metodika Architecture First Rudolf Pecinovský rudolf@pecinovsky.cz

Více

Java - řazení objektů

Java - řazení objektů Java - řazení objektů Kapitola seznamuje se základními principy řazení objektů Klíčové pojmy: Přirozené řazení, absolutní řazení, ideální porovnávatelná třída ŘAZENÍ OBJEKTŮ U objektů není příliš jasné,

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í 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