Java 8 Quiz - Testlauf

Wie schon anderswo geschrienen, will ich zur Java 8-Einführung in der Firma (yeah!) ein Quiz für meine Kollegen machen und hier “testlaufen” lassen. Es sollen um die 20 Fragen aus dem Bereich Lambdas, Streams, Methoden-Referenzen und Default-Methoden gehen. Bitte dran denken, dass es um Java 8 und nicht 9 geht (da frage ich in fünf Jahren mal nach). Um Verbesserungsvorschläge wird gebeten. Ich fang mal einfach an:

Q1

@FunctionalInterface
interface Named {

    String getName();

    default void greet() {
        System.out.println("Hello " + getName() + "!");
    }

    @Override
    String toString();
}

A - the definition of the interface ‘Named’ is valid
B - ‘Named’ is a functional interface (a.k.a. SAM type)
C - it can be instantiated by: Named named = () -> "Willy";
D - all of above
E - none of above

Kurze Rückfrage, von A, B und C können 0 (keine), 1 oder 3 (alle) richtig sein, aber nicht genau 2; richtig?

Also, soll aus A bis E genau eine Option gewählt werden?

Außerdem soll jede Antwort gespoilert werden; richtig?

Richtig. Ich wollte kein „echtes“ Multiple Choice, aber so kann man auch mehrere Antworten zulassen. Vielleicht doch keine so gute Idee?

Ja, wäre gut.

Mein Antwortversuch

ABC und D :smiley:

:smiley:

Ich glaube, dass ich doch auf Multiple Choice umschwenken sollte, das gibt mir einfach mehr Möglichkeiten pro Frage.

Dafür spricht auch, dass es am Ende einen Preis gibt (aber eben nur einen). Deshalb muss ich auch entsprechend „trennscharf“ sein, damit es möglichst einen eindeutigen Sieger gibt - ein paar obskure Fragen für ein Stechen kann ich ja trotzdem vorbereiten.

Egal wie du dich schlussendlich entscheidest, ein kurzes Intro, wie geantwortet werden muss, darf keinesfalls fehlen.

Die Multiple-Choice-Variante ist etwas schwieriger, weil es mehr Freiheitsgrade gibt. Bei der Frage 1 wäre so nämlich bspw. auch B + C möglich. Oder anders ausgedrückt: statt 5 gäbe es dann 8 Antwortmöglichkeiten. Ob es dann zu schwierig wird, musst du bewerten.

Mein Tipp für Frage 1

Antwort D

Na ja, ich werde auch sehr leichte Fragen stellen. Es sollen auch die angesprochen werden, an denen das Thema bisher vorbeigegangen ist. Aber ich brauche eben auch einen klaren Gewinner, deshalb müssen auch schwierigere Fragen dabei sein. (Kurzes) Googlen und Raten soll deshalb auch möglichst wenig bringen.

Ich ändere die restlichen Fragen erst mal auf Multiple Choice.

Übrigens danke für die rege Teilnahme :smiley:

Da muss sich der Kandidat doch nur hier den Thread durchlesen und hat dann einen Fundus an mehr oder minder qualifizierten Antworten :wink:

Ja, das ist ein gewisses Risiko. Ich würde zwar nochmal die Namen und Typen ändern, aber ich weiß nicht, ob das als Schutz ausreicht. Oder ihr postet möglichst viele falsche Antworten :smiley:

Man könnte den Thread auch verstecken, solange das Quiz läuft, aber natürlich kann Googles Caching trotzdem einen Strich durch die Rechnung machen :confused:

Q2

interface BiFunction<X, Y, R> {
    R apply(X x, Y y);
}

Given the interface ‚BiFunction‘, which of the following definitions will work?

A - BiFunction<Long, Long, Long> f = (x,y) -> x + y;
B - BiFunction<Long, Long, Long> f = (x,y) -> (x + y);
C - BiFunction<Long, Long, Long> f = (x,y) -> {x + y};
D - BiFunction<Long, Long, Long> f = (x,y) -> {return x + y;};

Antwortversuch für Q2, Nicht gegoogelt, Nicht getestet:

A, C und D. :slight_smile:


Edit: Nummerierung Q2 hinzugefügt, Antwort nicht verändert, den Pandabären entfernt, da Offtopic; gut dass jetzt mein Antwortversuch und cmrudolph voneinander divergieren, dh es ist schwieriger geworden.

Mein Tipp für Q2

A, B und D

Tipp

A,B,D

Nur am Rande: Wie sieht denn dann die “Auflösung” aus? Also, ich denke, die Antworten einfach aufzulisten, ohne ausführliche Begründung, würde nicht viel Sinn machen. Da stellt sich auch die Frage, wo/wie das Quiz insgesamt (zeitlich) ablaufen soll.

Also ich will das Quiz vorher online machen lassen, und die Auflösung gibt es in dem Meeting, in dem sonst immer die langweiligen Vorträge gehalten werden. Natürlich mit ordentlicher Begründung.

Gerade bin ich über die erste Frage gestolpert, die ich selbst falsch beantwortet hätte:

int[] ints = IntStream.of(1)
    .flatMap(i -> IntStream.iterate(i, j -> j + 1))
    .limit(5)
    .toArray();

The code above…

A - will lead to a StackOverflowError
B - will not compile
C - will run until memory is exhausted
D - will produce an array containing the values 1, 2, 3, 4 and 5

Ich würde das Verhalten als Bug ansehen…

1 „Gefällt mir“

Ungetestet:

Mein Tipp

C, weil Java keine echte Lazy-Evaluation macht.
Das limit in den Lambdaausdruck der zweiten Zeile zu bringen sollte das erwünschte Ergebnis bringen.

Naja, du hast quasi schon einen Hinweis gegeben.

Für Q3(?), nach Hinweis von Landei:

C.

Tipp

Hier läuft’s seit ein paar Minuten - wird wohl auf C rauslaufen :wink:

Geht’s da speziell um flatMap, oder warum nicht einfach

    int[] ints = IntStream.iterate(1, j -> j + 1)
        .limit(5)
        .toArray();        

?

@Marco13 Ja, mir ging es um das flatMap. Ist für mich unverständlich, dass das nicht auch lazy ausgewertet wird. Technisch spricht eigentlich nichts dagegen, oder?

Einen einfachen, plausiblen Grund kann ich nicht nennen. Kurzes browsen führt schnell in die Implementierungsdetails von Sinks & Co, die ich noch nicht sooo weit analysiert habe. Ein subtil-händeweldelnd-rechtfertigender Hinweis könnte in den JavaDocs von flatMap stecken:

Returns a stream consisting of the results of replacing each element of this stream with the contents of a mapped stream…

H.v.m

Das könnte (und sollte man in diesem Fall wohl auch) so verstehen, dass das flatMap eben nicht eine „Konkatenation“ der Streams liefert, die durch die Funktion entstehen (also nicht „DEN“ Stream, der in diesem Fall für i=1 erstellt wird), sondern einen neuen Stream, der den gesamten Inhalt der durch das mappen entstehenden Streams enthält. Und der Inhalt ist hier unendlich groß.

Es ist tatsächlich ein Bug: https://bugs.openjdk.java.net/browse/JDK-8075939