Hallo,
folgende Aufgabe hab ich:
Ihre Aufgabe besteht darin, die beiden Kommentare so zu ersetzen, dass das Beispiel funktionsfähig wird. Dabei soll die Methode f genau dann ein High zurückgeben, wenn ihr ein "five" übergeben wird. Die Groß-/Kleinschreibung spielt dabei keine Rolle. Ferner soll in das forEach ein Lambdaausdruck eingefügt werden, welcher eine Zeile mit high! für jedes High und sonst eine leere Zeile ausgibt.
ich hab folgendes Programm gegeben:
Code:
import java.util.Arrays;
import java.util.stream.Stream;
class HighFive {
enum R { High, Low }
/* Methode f */
public static void main(String[] args){
final Stream<R> rs = Arrays.stream(args).map(HighFive::f);
rs.forEach(/* λ-Ausdruck */);
}
}
Ich hab bisher das:
Code:
import java.util.Arrays;
import java.util.stream.Stream;
class HighFive {
enum R { High, Low }
/* Methode f */
public static String f(String a) {
if (a.equalsIgnoreCase("five")) {
return "High Five";
}
return null;
}
public static void main(String[] args){
final Stream<R> rs = Arrays.stream(args).map(HighFive::f);
rs.forEach(("high!")->"High");
}
}
Eigentlich ist meiner Meinung nach, die Methode f schon richtig. Leider bekomm ich den Lambda-Ausdruck nicht wirklich hin und irgendwie macht die Zeile davor Probleme, obwohl ich nichts geändert hab.
Deine Implementierung von 'f' tut dies jedoch nicht. Deine Implementierung gibt den String "High Five" zurück. Außerdem hat deine Methode 'f' den falschen Rückgabetyp. Schau dir mal das enum R an. Laut dem Arrays.stream().map() Ausdruck in der main() Methode muss 'f' den Rückgabetyp R haben, damit das funktioniert.
Desweiteren ist ("high!")->"High" kein gültiger Lambdaausdruck.
Entschuldigung, da hat sich ein Five eingeschlichen. Hab die Methode f folgendermaßen verändert:
Code:
public static R f(String a) {
if (a.equalsIgnoreCase("five")) {
return R.High;
}
return null;
}
Weiß nur nicht, ob er im "else"-Fall ein Low ausgeben soll oder das null.
Zu dem Lambda-Ausdruck weiß ich nicht, wie ich das mache mit dem else Fall. Weil wenn es nicht high ist, soll ja nichts ausgegeben werden. Und was ist hier mein Event?
Das Argument für Stream<T>.forEach(...) ist ein Consumer<T>, hat also eine Methode mit der Signatur void(T). Ein entsprechender Lambdaausdruck würde also einen Parameter besitzen und nichts zurückgeben.
Du könntest es also z.B. einfach mit einer if-Anweisung lösen: r -> {if (...) System.out.println(...);}
Ich versuche gerade zu verstehen, was mein Lambda-Ausdruck tun soll. Deshalb wollt ich fragen, ob ich es jetzt richtig verstanden hab:
Ich habe ein r vom Typ r und -> sagt mir was ist die Ausgabe. Da ich aber hier void haben muss, wie du oben bereits erwähnt hast, muss da System.out.println() stehen.
Was also jetzt mein Lambda-Ausdruck tun soll:
Ich muss schauen, was bei meiner Methode f passiert. Wenn ich f ein High ausgegeben wurde, muss ich ein high! ausgeben.
Das bedeutet jetzt:
Nein nein. Dein Lambdaausdruck (der Argument von Stream.forEach(...) ist), wird für jedes Element des Streams ausgeführt. Der Parameter (bei dir 'r') enthält dabei dann das jeweilige aktuelle Element. Das heißt, du kannst direkt 'r' verwenden für den Vergleich und musst nicht nochmal args bemühen.
Aber lese dir vielleicht erstmal ein Tutorial für Lambdaausdrücke durch. Oracle hat da ein paar gute Seiten. Und "->" bedeutet nicht "Ausgabe" im Sinne, wie es die Aufgabe verlang, also dass da irgendetwas auf die Konsole ausgegeben wird.