● Forelæsning Uge 6 – Mandag

Slides:



Advertisements
Lignende præsentationer
Velkommen til Softwarekonstruktion
Advertisements

FEN IntroJava AAU1 Java grundelementer Variable og datatyper Sætninger og udtryk Metoder.
Forelæsning 3.1 Collections Javas for-each løkke
Lektion 7 Læsestof: Kopier fra Caranno
8 RÅD VEDRØRENDE GOD PROGRAMMERING Effective (brown) Java.
03 – Udtryk og metoder. 2 NOEA2009Java-kursus – Udtryk og metoder Udtryk i Java Java har standard udtrykene… Værditildeling Subrutiner og funktionskald.
Opfølgning på Dygtig Skildpadde (Michael) To algoritmeskabeloner findEn findAlle Primitive typer (forfremmelse og begrænsning) Identitet versus lighed.
Begreber og Redskaber 11. Plan for idag Lidt afrunding: Collections Framework i Java Noget om oversættere og sprog Evaluering Sidste gang øvelser før.
Forelæsning 7.1 – repetition
Paradigmer i Programmering 3. Højere ordens funktioner Idag: Højere ordens funktioner Algebraiske datatyper Næste gang: I/O, Filer, interaktive programmer.
Effective Java Blå gruppe. Item 18: Interfaces frem for abstrakte klasser Kan implementeres i klasser der ikke nedarver Eksisterende klasser kan nemt.
Begreber og Redskaber 4. Plan for idag Om metoder, parametre, returværdier Et par ord om objekt-orientering Håndkøring af programmer.
Variabler, klassevariabler, identitet og lighed, collections
DAIMIIntroducerende objektorienteret programmering3B.1 Definition af klasser Klasseskelet, metoder, et eksempel: dato.
 Michael E. Caspersen, 2000Introducerende objektorienteret programmering6A.1 Programmering med interfaces – en stak og en HP-regnemaskine push pop.
Interfaces Afkobling af programkomponenter (eksempel: Comparable)
Programmering med interfaces – en stak og en HP-regnemaskine push pop.
Collectionklasser Klassifikation og anvendelse. dIntProg, F08Collectionklasser.2 Samlinger af objekter Objektreferencer –for at holde fast i et objekt.
 Jens Bennedsen 2001Multimedie programmering4.1 Definition af begreber Interface, implements, klasse.
Containerklasser – klassifikation og brug.  Michael E. Caspersen, 2003IOOPContainerklasser.2 Mange objekter Containerklasser –antag at man skal repræsentere.
Programmering I Java/C# Datatekniker Dit første projekt.
Lineære funktioner og udviklingsforløb. Tillægsspørgsmål  Tillægsspørgsmål 1: En særlig linje er tangenten. Redegør for hvordan man bestemmer tangentligningen.
Forelæsning Uge 4 – Torsdag
Algoritmeskabeloner findOne, findAll, findNoOf, findSumOf Primitive typer (forfremmelse og begrænsning) Identitet versus lighed (for objekter, herunder.
Forelæsning Uge 3 – Mandag Niveauer af programbeskrivelser – Statiske / dynamiske beskrivelser ArrayList –Collection med variabelt antal elementer –Der.
Quiz – Uge 4 – torsdag – første time. Skov med hjorte (stag = hjort) Programmér metoden ofSpecies. Metoden skal returnere en hjort af arten species. Hvis.
Forelæsning Uge 5 – Mandag
Forelæsning Uge 5 – Mandag
Forelæsning Uge 6 – Mandag
Forelæsning Uge 3 – Torsdag
Forelæsning Uge 3 – Torsdag
Forelæsning Uge 4 – Mandag
Anvendelse.
Forelæsning Uge 1 – Torsdag
Query optimization MICHAEL I
Forelæsning Uge 5 – Mandag
Forelæsning Uge 4 – Mandag
Forelæsning Uge 6 – torsdag – repetition
Forelæsning Uge 3 – Mandag
Quiz – Uge 4 – torsdag – første time
”Avanceret” Programmering
Quiz – Uge 4 – torsdag – første time
Forelæsning Uge 6 – Mandag
Forelæsning Uge 2 – Mandag
Klasser og objekter (Afsnit i manualen).
Quiz – Uge 3 – torsdag – første time
Forelæsning Uge 4 – Mandag
Forelæsning Uge 2 – Torsdag
Forelæsning Uge 3 – Mandag
● Forelæsning Uge 6 – Mandag
(brug af MVVMStarterLibrary2018)
Forelæsning Uge 5 – Mandag
Forelæsning Uge 5 – Mandag
Programmering.
Forelæsning Uge 12 – Mandag
Forelæsning Uge 4 – Mandag
Quiz – Uge 3 – mandag – første time
Quiz – Uge 4 – torsdag – første time
Forelæsning Uge 3 – Mandag
Quiz – Uge 4 – torsdag – første time
Quiz – Uge 3 – torsdag – første time
Forelæsning Uge 3 – Mandag
Forelæsning Uge 5 – Mandag
Forelæsning Uge 4 – Mandag
Quiz – Uge 4 – torsdag – første time
Forelæsning Uge 4 – Torsdag
Robotterne kommer - Ozobotterne.
Quiz Uge 2 – mandag.
Quiz – Uge 3 – mandag – første time
Præsentationens transcript:

● Forelæsning Uge 6 – Mandag Funktionel programmering i Java (Kapitel 5) Forskellen på imperative og funktionelle programmeringssprog Lambda'er (kodestumper, der kan bruges som parametre i et metodekald) Streams (sekvenser af data / strømme af data) De fem algoritmeskabeloner implementeret ved hjælp af streams og lambda'er Sortering ved hjælp af lambda'er Forskellige typer objektsamlinger (Kapitel 6) Lister (kendt fra ArrayList) Mængder Maps (afbildninger) Polymorfe variabler Dokumentation af jeres egne klasser

● Imperative og funktionelle sprog Java er et imperativt programmeringssprog Sproget har variabler, tilstand og assignments De fleste programmeringssprog er imperative Det gælder f.eks. C og C++ Funktionelle programmeringssprog fungerer anderledes Disse sprog har ikke variabler, tilstand og assignments I stedet evaluerer man komplicerede udtryk indeholdende funktioner (dvs. metoder som returnerer en værdi) Parametrene til en funktion kan selv være en funktion (højereordens funktion) Funktioner kan være anonyme (dvs. uden navn) Funktionelle sprog ligner på mange måder matematik/logik De er særdeles velegnede til visse programmeringsopgaver Eksempler på funktionelle sprog: Standard ML, Lisp, Haskell og Erlang

Lambda calculus Funktionelle programmeringssprog bygger på lambda calculus Formalisme til beskrivelse af beregninger (introduceret i 1930) Java (imperativt sprog) public int f(int n) { return n+1; } Funktion (metode) der lægger 1 til parameteren Standard ML (funktionelt sprog) fun f(n) = n+1; Man angiver ikke typerne Dem regner compileren selv ud fn(n) => n+1; Anonym funktion int  int Lambda calculus n.n+1 I vil lære meget mere om -calculus i senere kurser

Funktionelle aspekter i Java Java er et imperativt programmeringssprog Men de nyere versioner af Java (fra og med version 8 i 2014) indeholder også aspekter fra funktionelle programmeringssprog Det gør sproget mere kompliceret at lære Til gengæld kan man (som I snart skal se) udtrykke visse ting simplere og mere læseligt De funktionelle dele af Java vinder hurtigt indpas og er dermed et "must" for alle kompetente Java programmører De funktionelle aspekter af Java er bl.a. yderst velegnede til processering (gennemsøgning) af collections (objektsamlinger) F.eks. kan vi skrive vores fem algoritmeskabeloner langt mere kompakte og letlæselige

● Observationer af dyr (eksempel) public class Sighting { private final String animal; // Which animal private final int spotter; // Who saw it private final int count; // How many private final int area; // Where private final int period; // When public Sighting(String animal, int spotter, int count, int area, int period) { this.animal = animal; this.spotter = spotter; ... } public String toString() { return animal + ", count = " + count + ", area = " + area + ", spotter = " + spotter + ", period = " + period; BlueJ bogen kalder metoden for getDetails Som vi skal se om et øjeblik, er det bedre at kalde den toString Elephant, count = 24, area = 2, spotter = 3, period = 2

AnimalMonitor klassen import java.util.ArrayList; public class AnimalMonitor { private ArrayList<Sighting> sightings; public AnimalMonitor() { this.sightings = new ArrayList<>(); } // Add sightings from file public void addSightings(String filename) { SightingReader reader = new SightingReader(); sightings.addAll( reader.getSightings(filename) ); public void printList() { for(Sighting s : sightings) { System.out.println( s ); ... Returnerer en ArrayList<Sighting> println metoden kalder automatisk toString på s Elephant, count = 24, area = 2, spotter = 3, period = 2

● Lambda'er i Java En lambda er en "kodestump" Kan bruges i et metodekald (som værdi for en parameter) Den kaldte metode kan så udføre kodestumpen Skellet mellem kode og data forsvinder Imperativ kode For-each løkke Bruger kroppen på alle elementer public void printList() { for(Sighting s : sightings) { System.out.println(s); } Funktionel kode forEach metode (i ArrayList) Tager en lambda som parameter Bruger lambda'en på alle elementerne public void printList() { sightings.forEach( s -> System.out.println(s); ) }

Java syntaks for Lambda'er Den generelle syntax er som følger (parameters) -> { code; } Simplifikationer Hvis der kun er én parameter kan vi udelade ( ) Hvis kroppen kun har én sætning kan vi udelade { } og semikolonnet parameter -> code Eksemplet fra før s -> System.out.println(s)

● Streams i Java En stream er sekvens af data, f.eks. Elementerne i en collection (såsom en arrayliste) Data der "strømmer" ind via et netværk Tekstlinjer fra en tekstfil Tegn (char) fra en tekststreng (String) Karakteristika for streams Elementer tilgås ikke via et index (men i rækkefølge) De er immutable (rækkefølgen og elementer kan ikke ændres), men man kan lave en ny stream ud fra den gamle Streams kan være uendelige Elementer i en stream kan behandles parallelt på en multicore maskine Potentiel stor effektivitetsgevinst En arrayliste er ikke en stream Men ArrayList klassen har en metode, som skaber en stream ud fra arraylistens elementer (analogt for andre collections)

Streams har tre vigtige metoder (funktioner) filter funktionen Gennemløber en stream og skaber en ny indeholdende de elementer fra den gamle, som opfylder en given betingelse map funktionen Gennemløber en stream og skaber en ny ved at bruge en lambda på hvert element i den gamle stream reduce funktion Gennemløber en stream og returnerer en enkelt værdi (f.eks. ved at lægge alle værdierne i den gamle stream sammen) Stream med observationer af en given dyreart Stream med antal dyr, der er observeret i de enkelte observationer Total antal observationer

Pipelines (sammensætning af funktioner) Stream funktioner kan sættes sammen til en pipeline Nedenstående pipeline beregner hvor mange elefanter der er observeret Java (pseudokode) sightings.filter(animal == elephant) .map(count) .reduce(sum); For at få eksekverbar Java kode mangler vi to ting Arraylisten sightings skal "omdannes" til en stream Parametrene til filter, map og reduce funktionerne skal formaliseres

Opbygning af pipelines Pipelines er opbygget af en source (kilde) et antal intermediate (mellemliggende) operationer en terminal (afsluttende) operation, som producerer en værdi (eller har resultattypen void) Hver intermediate operation producerer en ny stream Eksemplet fra før sightings er kilden filter og map er intermediate reduce er terminal sightings.filter(animal == elephant) .map(count) .reduce(sum); Man kan nemt lave andre beregninger Hvad gør denne pipeline? sightings.filter(spotter == spotterID) .filter(period == dayID) .map(count) .reduce(sum);

Skaber en stream ud fra arraylisten (metode i ArrayList) Filter funktionen Gennemløber en stream og skaber en ny indeholdende de elementer fra den gamle, som opfylder en given betingelse Intermediate operation Udvælgelsen sker via et prædikat (predicate), dvs. en lambda med returtype boolean Input stream ændres ikke (streams er immutable) Skaber en stream ud fra arraylisten (metode i ArrayList) Prædikat, der bruger equals metoden fra String klassen til at afgøre, om det var en elefant, der blev observeret sightings.stream() .filter( s -> s.getAnimal().equals("Elephant")) .map(count) .reduce(sum); Sighting -> boolean Vi specificerer ikke typen for variablen s Compileren ved at sourcen leverer Sighting objekter

Map funktionen Gennemløber en stream og skaber en ny ved at bruge en lambda på hvert element i den gamle stream Intermediate operation Mapningen sker ved hjælp af en lambda Input stream ændres ikke (streams er immutable) sightings.stream() .filter( s -> s.getAnimal().equals("Elephant")) .map( s -> s.getCount() ) .reduce(sum); Sighting -> int Vi specificerer ikke typen for variablen s Compileren ved at sourcen, og dermed filter metoden, leverer Sighting objekter

Reduce funktionen Gennemløber en stream og returnerer én værdi Terminal operation Metoden har to parametre Første parameter er en startværdi Anden parameter er en lambda med to parametre Input stream ændres ikke (streams er immutable) sightings.stream() .filter( s -> s.getAnimal().equals("Elephant")) .map( s -> s.getCount() ) .reduce( 0 , (result, elem) -> result + elem ); Startværdi int * int -> int Java (pseudokode) for reduce funktionen result = startværdi; for (hvert element elem i stream) do { result = lambda(result, elem); } return result;

Færdig metode (med streams og lambda'er) /** * Return the number of sightings of the specified animal. * @param animal Type of animal. * @return Count of sightings of the given animal. */ public int getCount(String animal) { return sightings.stream() .filter( s -> s.getAnimal().equals(animal)) .map( s -> s.getCount() ) .reduce( 0 , (result, elem) -> result + elem ); } Vores pipeline (med parameteren animal indsat i stedet for konstanten "Elephant")

Alternativ til at bruge null til at angive, at man ikke har et objekt Andre Stream metoder Stream klassen har ca. 40 forskellige metoder hvoraf vi i det følgende vil bruge nedenstående count returnerer antallet af elementer i en Stream sum returnerer summen af elementerne i en IntStream mapToInt producerer en IntStream ud fra en Stream (ved hjælp af en brugerspecificeret lambda) findFirst returnerer første element i en stream af typen Stream<T> som et objekt af typen Optional<T> To muligheder Indeholder et objekt af type T isPresent() returnerer true get returnerer elementet Er tomt isPresent() returnerer false Kald af get giver runtime fejl Alternativ til at bruge null til at angive, at man ikke har et objekt

● Algoritmeskabelonerne, findOne + findAll Vores fem algoritmeskabeloner kan implementeres via streams og lambda'er public Optional<TYPE> findOne( PARAM ) { return LISTE.stream() .filter( elem -> TEST(elem, PARAM)) .findFirst(); } Lav en stream ud fra Arraylisten Returner det første af disse (som en Optional) Find de elementer, der opfylder TEST public List<TYPE> findAll( PARAM ) { return LISTE.stream() .filter( elem -> TEST(elem, PARAM)) .collect(Collectors.toList()); } Returner de fundne elementer som en objektsamling af typen List List og Collectors introduceres i afsnit 6.17

findNoOf og findSumOf public long findNoOf( PARAM ) { return LISTE.stream() .filter( elem -> TEST(elem, PARAM)) .count(); } Lav en stream ud fra Arraylisten Tæl hvor mange der er (returnerer en long) Find de elementer, der opfylder TEST public int findSumOf( PARAM ) { return LISTE.stream() .filter( elem -> TEST(elem, PARAM)) .mapToInt( elem -> VALUE(elem, PARAM)) .sum(); } Læg elementerne sammen Lav en Stream med heltal

Find de elementer der opfylder TEST Lav en stream ud fra Arraylisten findBest Find de elementer der opfylder TEST public Optional<TYPE> findBest( PARAM ) { return LISTE.stream() .filter( elem -> TEST(elem, PARAM)) .max(new BEST()); } Lav en stream ud fra Arraylisten Returner bedste element (som en Optional) Ordningen bestemmes ved hjælp af en klasse BEST, der implementerer Comparator interfacet Comparator har en klassemetode comparing Tager en lambda som parameter og returnerer en Comparator klasse Parameteren specificerer, hvilken feltvariabel, der skal anvendes under sammenligningen public Optional<Dog> youngestOfBreed (String breed){ return dogs.stream() .filter(d -> d.getBreed().equals(breed)) .min( Comparator.comparing (d -> d.getAge()) ); } Klassemetode Lambda'en udpeger den feltvariabel, der skal sammenlignes

Sammenligning af algoritmeskabelonerne De funktionelle er mere kompakte og letlæselige end de imperative Alle funktionelle algoritmeskabeloner starter på samme måde public returtype find XXX( PARAM ) { return LISTE.stream() .filter( elem -> TEST(elem, PARAM)) .??? } De to første linjer i kroppen er ens Kun sidste linje er forskellig findOne findAll findNoOf findSumOf findBest .findFirst(); Optional<TYPE> .collect(Collectors.toList()); List<TYPE> .count(); long .mapToInt( elem -> VALUE(elem, PARAM)) .sum(); int .max( Comparator.comparing(d -> d.getField())); Optional<TYPE>

● Sortering Indtil nu har vi sorteret ved at skrive en compareTo metode For Phone opgavesættet ser dette ud, som vist nedenfor Vi sorterer efter pris, og hvis prisen er den samme efter brand public int compareTo(Phone other){ if(price != other.getPrice()) { return price – other.getPrice(); } return brand.compareTo(other.getBrand()); Fastlæggelse af ordning via compareTo metode public void printWebShop(){ System.out.println(name); Collections.sort(phones); for(Phone p : phones { System.out.println(p); } Udskrift af webshoppens navn Sortering Pæn udskrift af den sorterede arrayliste

Pause Funktionel sortering Som vi har set, har Comparator interfacet en klassemetode, der gør det let at definere ordninger For Phone opgavesættet kan dette anvendes, som vist nedenfor Vi sorterer efter pris, og hvis prisen er den samme efter brand public void printWebShop(){ System.out.println(name); Collections.sort(phones, Comparator.comparing(p -> p.getBrand()) ); Collections.sort(phones, Comparator.comparing(p -> p.getPrice()) ); for(Phone p : phones) { System.out.println(p); } Udskrift af webshoppens navn Pæn udskrift af den sorterede arrayliste Sortering (inklusiv fastlæggelse af ordning) Vi slipper for at skrive compareTo metoden Kaldene af sort metoden har en ekstra parameter, der fastlægger ordningen Vi starter med det mindst betydende sorteringskriterie sort metoden er stabil (stable) og bytter ikke om på "ens" elementer Hvis man vil have dyreste først sætter man et minus på lambda'ens højreside Pause

● Map (afbildning) Afbildning fra en type ind i en anden Der er mange forskellige maps – på samme måder som der er forskellige lister Her vil vi se på HashMap<K, V> klassen Parametriseret klassen K angiver keys (nøgler) – den type der afbildes fra V angiver values (værdier) – den type der afbildes til Et Map objekt indeholder par på formen (k,v), hvor k er af typen K og v af typen V Hvis man kender nøglen k kan man slå værdien v op (ved hjælp af Map objektet) En værdi v kan være knyttet til flere nøgler (afbildningen behøver ikke være injektiv) Omvendt har en nøgle højst én tilknyttet værdi (ellers ville det være en relation og ikke en afbildning)

contacts : HashMap<String, String> Telefonliste En telefonliste er et typisk eksempel på brug af Map K er personer, mens V er deres telefonnumre Begge repræsenteres som tekststrenge (String) "Ida Thomasen" "4525 2512" "Ole Rasmussen" "hemmeligt" "Peter Andersen" contacts : HashMap<String, String> "2674 5681" Alternativt kan man bruge HashMap<String, Integer> Nu er værdierne heltal (og man må finde en anden måde at angive, at et nummer er hemmeligt)

Implementation af telefonliste // Oprettelse af kontaktliste HashMap<String, String> contacts = new HashMap<>(); // Operettelse af kontakter contacts.put("Peter Andersen", "2674 5681"); contacts.put("Ida Thomasen", "4525 2512"; contacts.put("Ole Rasmussen", "hemmeligt"); // Opslag i kontaktlisten String number = contacts.get("Ida Thomasen"); System.out.println(number); put metoden indsætter nye par Hvis nøglen allerede er i brug glemmes det gamle par get metoden laver opslag "4525 2512" Returnerer den værdi der er knyttet til den anvendte nøgle (null hvis nøglen ikke er i brug) Andre metoder i HashMap size metoden fortæller, hvor mange par, der er i afbildningen keySet metoden returnerer en mængde indeholdende alle de nøgler (keys), der er i brug I alt er der ca. 20 metoder. Studér disse i Java API'en

persons : HashSet<String> ● Set (mængde) Matematisk mængde Et element kan højst forekomme én gang i mængden Indsætter man elementet en gang til, har det ingen effekt Der er mange forskellige mængder – på samme måde, som der er forskellige lister og maps Her vil vi se på HashSet<E> klassen En mængde af personnavne kan modelleres via HashSet<String> "Ida Thomasen" "Ole Rasmussen" "Peter Andersen" persons : HashSet<String>

Implementation af mængde af personer // Oprettelse af mængde HashSet<String> persons = new HashSet<>(); // Indsættelse af personnavne persons.add("Peter Andersen"); persons.add("Ida Thomasen"); persons.add("Ole Rasmussen"); System.out.println(persons.size()); add metoden indsætter elementer returnerer true, hvis mængden ændres 3 size metoden fortæller, hvor mange elementer der er i mængden // Indsæt et navn, der allerede er i mængden persons.add("Ida Thomasen"); System.out.println(persons.size()); add metoden returnerer false, hvis mængden ikke ændres 3 Det er equals metoden (for element typen E), der bruges til at afgøre, om elementet allerede forekommer i mængden

Indlæsning af kommando fra bruger Returnerer en mængde af tekststrenge Metodens navn " Hans Peter " public HashSet<String> getInput() { System.out.print("> "); String inputLine = reader.nextLine() .trim().toLowerCase(); String[] wordArray = inputLine.split(" "); HashSet<String> words = new HashSet<String>(); for( String word : wordArray ) { words.add(word); } return words; Prompt bruger for input Næste linje fra reader "hans peter" Array (Kap. 7) Ligner arraylister, men har et fast (på forhånd kendt) antal elementer Fjern blanke fra enderne og konverter til små bogstaver Erklæring af mængde af tekststrenge Returner den konstruerede mængde Metode i String klassen Opdeler strengen de steder, hvor der er blanke tegn (parameteren) Returnerer "stumperne" i et array for-each løkke, hvor arrayets elementer kopieres over i mængden > peter besøgte hans peter "peter" "besøgte" "hans" "peter" "peter" "besøgte" "hans"

● Collections (objektsamlinger) Forskellige måder at gruppere objekter ArrayList, LinkedList, … (lister) HashMap, TreeMap, LinkedHashMap, … (maps) HashSet, TreeSet, LinkedHashSet, … (mængder) Sidste del af navnet angiver om det er en liste, map eller mængde (set) Første del af navnet angiver implementationsmetoden Alle collections er parametriserede typer Parametrene skal være objekt typer For de primitive typer bruges de tilsvarende wrapper typer Alle collections har de samme navne på metoder F.eks. size, clear og isEmpty Bemærk dog, at man i lister og mængder indsætter via add metoden, mens man i maps indsætter via put metoden

Polymorfe variabler Når vi skriver et program, behøver vi ikke fra start at fastlægge, hvilken type objektsamling vi vil anvende I stedet for at erklære en variabel til at referere til en arrayliste kan man med stor fordel nøjes med at angive at den refererer til en liste Man kan så senere let udskifte en type liste med en anden Det eneste sted man skal ændre i koden er, der hvor listen oprettes. Her angiver man hvilken type liste man vil bruge ArrayList<Person> persons; List<Person> persons; persons = new ArrayList<>(); persons = new LinkedList<>(); Tilsvarende kan vi definere polymorfe variabler for mængder og maps Set<Person> persons; Map<Person,Person> farthers;

● Dokumentation Når I (fremover) konstruerer en klasse skal den dokumenteres lige så godt som klasserne i Javas API Ellers får I genaflevering For klassen skal I angive En kommentar der beskrive klassens overordnede formål og virkemåde (se eksempler i Javas API) Et versions nummer (som bør indeholde datoen) Forfatterens navn(e) For hver konstruktør/metode skal I angive En kommentar der beskrive virkemåde Beskrivelse af de enkelte parametre Beskrivelse af den returnerede værdi /** * Comment */ @version 2016-12-24 @author Kurt Jensen /** * Comment */ @param animal Type of animal. Første sætning bruges i "Summary"-delen Hele kommentaren bruges i "Details"-delen @return List of all sightings.

● Opsummering Funktionel programmering i Java (Kapitel 5) Forskellen på imperative og funktionelle programmeringssprog Lambda'er (kodestumper, der kan bruges som parametre i et metodekald) Streams (sekvenser af data / strømme af data) De fem algoritmeskabeloner implementeret ved hjælp af streams og lambda'er Sortering ved hjælp af lambda'er Forskellige typer objektsamlinger (Kapitel 6) Lister (kendt fra ArrayList) Mængder Maps (afbildninger) Polymorfe variabler Dokumentation af jeres egne klasser Ved køreprøven skal opgaverne løses ved hjælp af imperativ programmering Det er forbudt at bruge Streams og lambda'er

Resten af kapitel 6 i BlueJ bogen Kapitel 6 er forholdsvis langt, men det indeholder mange ting, som I allerede er stødt på her i kurset, og derfor vil have let ved at læse Læsning og skrivning af Java dokumentation Brug af klassen Random til at generere tilfældige tal Import af klasser og pakker fra Javas klassebibliotek Automatisk konvertering af værdier mellem primitive typer og de tilhørende wrapper klasser Brug af nøgleordene public og private Klassevariabler og klassemetoder (static) Konstanter (final) Læs kapitlet grundig – uden at springe afsnit over Det er nyttig repetition og tilføjer nye detaljer

Det var alt for nu….. … spørgsmål