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