Oppgave 1
I flg. grensesnitt er det to abstrakte metoder:
@FunctionalInterface // en annotasjon public interface Oppgave<T> // legges under hjelpeklasser { void utførOppgave(T t); // en abstrakt metode void utførNyOppgave(T t); // en abstrakt metode }
I et funksjonsgrensesnitt kan det være kun én abstrakt metode. Annotasjonen gjør at det vil komme en feilmelding. I NetBeans kommer det flg. «Unexpected @FunctionalInterface annotation. Oppgave is not a functional interface. Multiple non-overriding abstract methods found in interface Oppgave.» I Eclipse kommer det: «Invalid '@FunctionalInterface' annotation. Oppgave<T> is not a functional interface.»
Oppgave 2
I flg. kode får variabelen lengde
ny verdi etter lambda-uttrykket:
String[] s = {"Sohil","Per","Thanh","Ann","Kari","Jon"}; // en String-tabell int lengde = 4; // en int-variabel Oppgave<String> oppgave = x -> // et lambda-uttrykk { if (x.length() < lengde) System.out.print(x + " "); // sjekker lengden }; // obs: semikolon tabellOppgave(s, oppgave); // Utskrift: Per Ann Jon lengde = 5;
I NetBeans kommer feilmeldingen: «local variables referenced from a lambda expression must be final or effectively final». I Eclipse kommer det: «Local variabel lengde defined in an enclosing scope must be final or effectively final».
Oppgave 3
String[] s = {"Sohil","Per","Thanh","Ann","Kari","Jon"}; StringJoiner sj = new StringJoiner(", ", "[", "]"); tabellOppgave(s, x -> sj.add(x)); String navn = sj.toString(); System.out.println(navn); // Utskrift: [Sohil, Per, Thanh, Ann, Kari, Jon]
Oppgave 4
Oppgave<String> oppgave = x -> { for (int i = 0; i < 2; i++) System.out.print(x + " "); System.out.println(x); };
Oppgave 5
public static <T> Oppgave<T> konsollutskrift(String format) { return t -> System.out.printf(format,t); }
String[] s = {"Sohil","Per","Thanh","Ann","Kari","Jon"}; tabellOppgave(s, Oppgave.konsollutskrift("%s "));
Oppgave 6