Lambdas. (och fler design patterns) Objekt-orienterad programmering och design (DIT952) Niklas Broberg, 2017

Relevanta dokument
Objekt-orienterat vs funktionellt Objekt-orienterad programmering och design (DIT952) Niklas Broberg, 2016

Objekt-orienterat vs funktionellt Objekt-orienterad programmering och design (DIT952) Niklas Broberg, 2017

Objekt-orienterat vs funktionellt Objekt-orienterad programmering och design (DIT953) Niklas Broberg, 2018

Generic type declarations. Objekt-orienterad programmering och design (DIT952) Niklas Broberg, 2016

Subtyping, co- och contra-variance. Objekt-orienterad programmering och design Alex Gerdes, 2016

Generics och polymorfism. Objekt-orienterad programmering och design (DIT952) Niklas Broberg, 2016

Subtyping, co- och contra-variance. Objekt-orienterad programmering och design (DIT952) Niklas Broberg, 2016 Johannes Åman Pohjola, 2017

Generics och polymorfism. Objekt-orienterad programmering och design (DIT953) Niklas Broberg / Johannes Åman Pohjola, 2018

Static vs Dynamic binding Polymorfism. Objekt-orienterad programmering och design (DIT953) Niklas Broberg, 2018

Subtyping och variance. Objekt-orienterad programmering och design Alex Gerdes, 2018

Separation of Concern. Objekt-orienterad programmering och design (DIT953) Niklas Broberg / Johannes Åman Pohjola, 2018

Static vs Dynamic binding Override vs Overload. Objekt-orienterad programmering och design Alex Gerdes och Sólrún Halla Einarsdóttir, 2018

Static vs Dynamic binding Polymorfism. Objekt-orienterad programmering och design Alex Gerdes, 2016

Classes och Interfaces, Objects och References Objekt-orienterad programmering och design (DIT952) Niklas Broberg, 2016

Classes och Interfaces, Objects och References, Initialization

Separation of Concern. Objekt-orienterad programmering och design (DIT952) Niklas Broberg, 2016 Johannes Åman Pohjola, 2017

Mutability och State. Objekt-orienterad programmering och design (DIT953) Niklas Broberg / Johannes Åman Pohjola, 2018

Objekt-orienterad programmering och design. DIT953 Niklas Broberg, 2018

Bankkonto - övning. Övning 2 Skriv en metod, geträntan, som returnerar räntan.

Tentamen. DD2385 Programutvecklingsteknik vt 2014 Måndagen den 2 juni 2014 kl Hjälpmedel: penna, suddgummi, linjal

Objekt-orienterad Programmering och Design. TDA552 Alex Gerdes, HT-2018

Modulär design Objekt-orienterad programmering och design (DIT952) Niklas Broberg, 2016

Modulär design. Objekt-orienterad programmering och design (DIT953) Niklas Broberg / Johannes Åman Pohjola, 2018

Objekt-orienterad Programmering och Design. TDA551 Alex Gerdes, HT-2016

Laboration 1: Figurer i hierarki

TENTAMEN I PROGRAMSPRÅK -- DVG C kl. 08:15-13:15

TENTAMEN I DATAVETENSKAP

TDDD78 Objektorientering: Lagring och livstid

Typkonvertering. Java versus C

TDP002 - Imperativ programmering

Dagens program. Programmeringsteknik och Matlab. Objektorienterad programmering. Vad är vitsen med att ha både metoder och data i objekten?

Tillämpad Programmering (ID1218) :00-13:00

DD1361 Programmeringsparadigm. Carina Edlund

Model View Controller. Objekt-orienterad programmering och design (DIT952) Niklas Broberg, 2016

TDDC77 Objektorienterad Programmering

UML. Objekt-orienterad programmering och design (DIT952) Niklas Broberg, 2016

Universitetet i Linköping Institutionen för datavetenskap Anders Haraldsson

Objektorienterad Programmering DAT043. Föreläsning 9 12/2-18 Moa Johansson (delvis baserat på Fredrik Lindblads material)

Java, klasser, objekt (Skansholm: Kapitel 2)

Subklasser och arv Inledning till grafik (JFrame och JPanel). Något om interface. Objektorienterad programvaruutveckling GU (DIT011) Subklasser

Objektorienterad programmering

Datalogi I, grundkurs med Java 10p, 2D4112, Fiktiv tentamen, svar och lösningar och extra kommentarer till vissa uppgifter 1a) Dividera förs

Dagens föreläsning Programmering i Lisp. - Bindning av variabler (avs 14.6) fria variabler statisk/lexikalisk och dynamisk bindning

"Är en"-relation. "Har en"-relation. Arv. Seminarium 2 Relevanta uppgifter. I exemplet Boll från förra föreläsningen gällde

Kopiering av objekt i Java

Sätt att skriva ut binärträd

Objektorienterade programmeringsspråk. Objektorienterade språk. Den objekt-orienterade modellen. Jämför med icke-oo

725G61 - Laboration 7 Implementation av ett API. Johan Falkenjack

Föreläsning 5-6 Innehåll. Exempel på program med objekt. Exempel: kvadratobjekt. Objekt. Skapa och använda objekt Skriva egna klasser

DAT043 - föreläsning 8

Föreläsning 5-6 Innehåll

Objektorienterad Programmering DAT043

Introduktion till programmering. Programspråk och paradigmer

Klassdeklaration. Metoddeklaration. Parameteröverföring

2I1049 Föreläsning 5. Objektorientering. Objektorientering. Klasserna ordnas i en hierarki som motsvarar deras inbördes ordning

Att deklarera och att använda variabler. Föreläsning 10. Synlighetsregler (2) Synlighetsregler (1)

TENTAMEN. Kurs: Objektorienterad programmeringsmetodik 5DV133 Ansvarig lärare: Anders Broberg. VT-13 Datum: Tid: kl

OOP Objekt-orienterad programmering

Tentamen i Objektorienterad modellering och diskreta strukturer

Objektorientering: Lagring och livstid

Objektorienterad Programkonstruktion. Föreläsning 6 23 nov 2015

Lite om felhantering och Exceptions Mer om variabler och parametrar Fält (eng array) och klassen ArrayList.

Objektorientering: Lagring, räckvidd och livstid

Föreläsning 2 Objektorienterad programmering DD1332. Typomvandling

Introduktion till Datalogi DD1339. Föreläsning 1 8 sept 2014

Föreläsning 8 - del 2: Objektorienterad programmering - avancerat

Tentamen. Datalogi I, grundkurs med Java 10p, 2D4112, Lördagen den 30 november 2002 kl , salar E33, E34

Tentamen OOP

Objektorienterad programmering Föreläsning 8. Copyright Mahmud Al Hakim Agenda (halvdag)

Tentamen. DD2385 Programutvecklingsteknik vt 2013 Onsdagen den 22 maj 2013 kl Hjälpmedel: penna, suddgummi, linjal

Tentamen ID1004 Objektorienterad programmering October 29, 2013

TDDE10 TDDE11, 725G90/1. Objektorienterad programmering i Java, Föreläsning 2 Erik Nilsson, Institutionen för Datavetenskap, LiU

Objektorienterad programmering Föreläsning 5

Föreläsning 3: Booleans, if, switch

Imperativ programmering. Föreläsning 3

Kort om klasser och objekt En introduktion till GUI-programmering i Java

Administrativt. Programmeringsteknik för I1. Dagens program. Objektorienterad programmering

Lab5 för prgmedcl04 Grafik

Tentamen i. TDDA 69 Data och programstrukturer

DAT043 - Föreläsning 7

Föreläsning 1, vecka 6: Abstraktion genom objektorientering

Tentamen. 2D4135 vt 2005 Objektorienterad programmering, design och analys med Java Lördagen den 28 maj 2005 kl

Generiska klasser och funktioner

TDDC74 Programmering: Abstraktion och modellering Datordugga 2 - exempel

Objektorientering. Objekt och metoder. Objektorientering. Viktiga begrepp. Klass. Objekt. Deklarativ programmering

Föreläsning 7 Innehåll. Rekursion. Rekursiv problemlösning. Rekursiv problemlösning Mönster för rekursiv algoritm. Rekursion. Rekursivt tänkande:

Programmering II (ID1019)

Malmö högskola 2008/2009 CTS

Föreläsning 8. newtype Chess = Chess [(Square, Chessman)] -- data ist f newtype OK -- data istället för newtype krävs om >1 konstruerare.

(Man brukar säga att) Java är... Denna föreläsning. Kompilering av Java. Historik: Java. enkelt. baserat på C/C++ Allmänt om Java

Objekt, klasser. Tillstånd Signatur Kommunikation Typ. Fält, parametrar och lokala variabler. Konstruktorer Metoder DAVA15

JavaScript. JavaScript Ramverk (Bibliotek) jquery + jquery UI

Objektorienterad Programkonstruktion. Föreläsning 4 8 nov 2016

Arv. Fundamental objekt-orienterad teknik. arv i Java modifieraren protected Lägga till och modifiera metoder med hjälp av arv Klass hierarkier

Föreläsning 5&6 LOGISKA VARIABLER; IMPLEMENTERA KLASSER; MER ALGORITMER

TDDD78, TDDE30, 729A Introduktion till Java -- för Pythonprogrammerare

TDDD78 Introduktion till OOP i Java

TDDC30. Objektorienterad programmering i Java, datastrukturer och algoritmer. Föreläsning 2 Jonas Lindgren, Institutionen för Datavetenskap, LiU

TDDC30. Objektorienterad programmering i Java, datastrukturer och algoritmer. Föreläsning 11 Jonas Lindgren, Institutionen för Datavetenskap, LiU

Introduktion till Datalogi DD1339. Föreläsning 2 22 sept 2014

Transkript:

Lambdas (och fler design patterns) Objekt-orienterad programmering och design (DIT952) Niklas Broberg, 2017

Funktioner En funktion (i programmeringstermer) är en operation som tar ett eller flera argument, och ger ett resultat. Quiz: Vad skiljer en funktion från en metod? En statisk metod i Java är en funktion. Vi kallar den bara något annat. En instansmetod i Java är också en funktion, med särskild syntax, där instansen på vilken metoden anropas är ett implicit argument till funktionen. Ibland används distinktionen att en funktion ska vara deterministisk, eller till och med pure, men oftast inte.

Funktionella språk Ett programspråk sägs vara funktionellt om det tillåter oss att använda funktioner som om de vore värden ( first-class functions ): Deklarera variabler som representerar funktioner: f = show Applicera funktionsvariabler på argument:. x = f 5 Skicka funktioner som argument till andra funktioner (metoder). map f [1,2,3,4,5] Skapa anonyma funktioner som värden: map (\x -> x+5) [1,2,3,4,5] Exemplen givna med Haskell-syntax

Lambda expression Termen lambda expression ( lambda-uttryck ) beskriver just en funktion som används anonymt. Ursprunget är Alonzo Church s Lambda calculus. (\x -> x+5) = λx.x+5 Ta ett argument, som vi kallar x, och gör så här

Lambdas och Java Så sent som i Java 8 (2014) har vi fått stöd för lambda expressions i Java. Vad vi kan göra med dessa är dock lite begränsat, jämfört med ett riktigt funktionellt språk. Problemet ligger i hur vi kan deklarera en funktions-typ. Java är ett statiskt typat språk, så allt måste ges en typ. I språk som (e.g.) Haskell finns enkel syntax för funktionstyper: f :: Int -> Int Java har historiskt inget sätt att skriva ut funktionstyper, och de som designade Java 8 ville inte göra för stora avsteg från Java s kärna.

Functional Interface Ett functional interface i Java är ett interface som deklarerar exakt en metod: @FunctionalInterface public interface MyFunction { public int thefunction(int x); } Vi kan använda lambda expressions som short-hand för objekt som implementerar ett sådant functional interface, e.g. MyFunction f = x -> x+5; int y = f.thefunction(5);

Lambda syntax Ett lambda expression i Java har följande syntax: En lista av parametrar, e.g. (x,y,z) Om vi bara har en parameter kan vi utelämna parenteserna. Om vi inte tar något argument alls skriver vi () (Lustigt nog har vi inget lambda först.) En pil: -> En method body: { return x+5; } Om vår body består av bara ett expression vars resultat ska returneras behöver vi varken {} eller return, vi skriver bara uttrycket: x+5 (x,y) -> x+y; x -> x+5; s -> { System.out.println(s); }; () -> 42; Exempel på giltiga lambda expressions i Java.

Övning Börja från koden som finns att ladda ner från hemsidan. Vi har ett nytt package DIT952.macro, som i nuläget är ganska tomt. Resten av koden ser ut precis som den gjorde efter föreläsningen igår. Vårt mål med dagens övning är att skapa makron objekt som representerar en sekvens av transformationer över polygoner, och som kan appliceras när så önskas. I DIT.macro finns ett interface Transform. Detta ska vara ett functional interface, med en enda metod transform, som representerar en transform av en polygon. Vilka argument- och retur-typer bör metoden ha? Deklarera denna metod. Fyll i exempel-klassen ExampleTransform som implementerar detta interface. Klassen Macro representerar en sekvens av transformationer, som ska kunna appliceras som en enhet. Transformationer ska kunna läggas till med metoden addtransform. Implementera denna metod. Implementera en metod transform i Macro som applicerar alla transformer som lagrats. Vilka argument- och retur-typer bör denna metod ha? (Är ett Macro en Transform?)

Övning forts. Nästa steg blir att använda oss av dessa macron: I PolygonModel finns metoden update, som anropas av animate. Uppdatera dessa metoder så de tar ett Macro-objekt som argument, och baserar animationen på detta, istället för det nuvarande hårdkodade beteendet. I DrawPolygons.main, skapa ett Macro som ni ger som argument till anropet till animate. Lägg till några transformationer till detta Macro. I anropet till addtransform, använd först ExampleTransform. Byt sen ut detta till att använda ett lambda-uttryck som gör samma sak. Vad heter det design pattern vi just implementerat? För mer utmaning, utan inbördes ordning: Låt animate ta en lista av macron, och skicka dem ett och ett till update. Börja om från början när ni når slutet av listan. Vad skulle det krävas för att vi ska kunna skicka argument till våra makron? Kan ni implementera en bra lösning? Lägg till en Controller som låter användaren dynamiskt lägga till fler transformer i de(t) macro som animeras, och/eller fler macron i listan som animate använder.