Løsningsforslag - oppgaver i Avsnitt 1.9.1


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

  1. Konsumenter: Consumer, BiConsumer, DoubleConsumer, IntConsumer, LongConsumer, ObjDoubleConsumer, ObjIntConsumer, ObjLongConsumer - 8 stykker
  2. Produsenter: Supplier, BooleanSupplier, DoubleSupplier, IntSupplier, LongSupplier - 5 stykker
  3. Funksjoner: Function, BiFunction, DoubleFunction, IntFunction, LongFunction, ToDoubleFunction, ToIntFunction, ToLongFunction, ToDoubleBiFunction, ToIntBi­Function, ToLongBiFunction, DoubleToIntFunction, DoubleToLongFunction, IntToDouble­Function, IntToLongFunction, LongToDoubleFunction, LongToIntFunction - 17 stykker
  4. Predikater: Predicate, BiPredicate, DoublePredicate, IntPredicate, LongPredicate - 5 stykker
  5. Operatorer: BinaryOperator, UnaryOperator, DoubleBinaryOperator, DoubleUnary­Operator, IntBinaryOperator, IntUnaryOperator, LongBinaryOperator, LongUnary­Operator - 8 stykker