Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.
Expand

dhkflahdsøfhlads

fhdklasøf

gjkl

nfdklak

Expand
titleDel 1 - Typer og Funksjonelle Grensesnitt (15%)
Oppgave a)

Typen til Java-uttrykk er basert på typen til deluttrykkene. F.eks. har uttrykket 1 + 2 typen int, fordi int + int gir en int.

Bestem og forklar typen til følgende uttrykk:

  1. ”Java” + ”eksamen”
  2. ”Java” + ”eksamen” == ”sant”
  3. 1 / 2
  4. ”0” + ”123”.charAt(5)
  5. ”0123”.charAt(0) - ’0’
Expand
titleLF
  1. String + String gir String
  2. String + String == String gir boolean
  3. int / int gir int
  4. String + char gir String (selv om koden kræsjer)
  5. char – char gir int

 

Oppgave b) 

Anta at en har følgende variabel-deklarasjon og initialisering:
Collection<String> strings = new ArrayList<String>()

Hva er sammenhengen mellom typen på venstre- og høyresiden av tilordningstegnet (=)? Hvordan påvirker String-spesialiseringen (altså det som står mellom < >) bruken av strings-variabelen?

Expand
titleLF

Typen på høyresiden må være den samme eller en subklasse (inkl. implementasjonsklasse, som her) av typen på venstresiden. Spesialiseringen må være den samme. String-spesialiseringen påvirker parametertyper og returtyper for Collection- og ArrayList-metodene. F.eks. vil get returnere String og add og set-metodene vil ta en String som parameter.

Se også Collection-rammeverket

Oppgave c)

Hva er et funksjonelt grensesnitt? 

Expand
titleLF

Et funksjonelt grensesnitt har bare én abstrakt metode, og resultatet av å utføre metoden skal alltid være det samme for samme argumenter. Dette gjør at man kan tenke på implementasjonen som en matematisk funksjon. Det er også et poeng (men underordnet) at grensensittet er ment å være den primære funksjonen til klassen som implementerer den. Ellers gir det ikke så mye mening å bruke anonyme klasser/lambda-uttrykk til å implementere grensesnittet. Et eksempel på dette er Comparator, som kun implementeres for å sammenligne argumentene. Comparable-derimot, implementeres av dataklasser og er derfor en sekundær funksjon, som det ikke er noe poeng å implementere som primærfunksjon.

 

Oppgave d)

Det funksjonelle grensesnittet Predicate<T> er definert som følger:

Code Block
themeEclipse
languagejava
titlePredicate
public interface Predicate<T> {
    /**
     * Evaluates this predicate on the given argument.
     * Returns true if the input argument matches the predicate,
     * otherwise false
     */
    boolean test(T t);
}

Anta vi har en Person-klasse med metodene getGender() (returnerer tegnet ’F’ dersom personen er en kvinne, ’M’ om personen er en mann og ’\0’ om kjønnet er ukjent) og getAge() (returnerer alderen). Skriv en metode getMatchingPersons som tar inn en Collection av Person-objekter og et Predicate (også for personer) og returnerer en ny Collection med de personene som tilfredsstiller betingelsen angitt av Predicate-argumentet. Vis hvordan metoden kan kalles med et predikat som sier om personen skal kalles inn til sesjon, dvs. er 18 år og mann

Expand
titleLF

Metoden deklareres som Collection<Person> getMatchingPersons(Collection<Person> persons, Predicate<Person> test). Koden kan skrives på (minst) to måter, enten som en én-linjer med Stream-teknikken eller med en løkke som tester og legger til en resultat-liste. Kallet gjøres enklest med lambda-notasjonen:
getMatchingPersons(persons, p -> p.getGender() == ’M’ && p.getAge() == 18)

Lenke til løsningskoden (med varianter av getMatchingPerson): Functional.java

Se også  Lambda-uttrykk og funksjonelle grensesnitt i Java 8

 

...