Einfaches tutorial, Beispiel, (lambda-Ausdruck) nicht laufen
Schließlich beschlossen, zu starten, ein wenig Experimentieren auf die neuen features von jdk8, nämlich die lambda-Ausdrücke nach dem tutorial. Für die Bequemlichkeit, ich stripped-down-Beispiel, siehe SSCCE unten.
Eingabe aus, die das Prädikat nur gut läuft, refactoring es um einen lambda-Ausdruck als vorgeschlagen (und tatsächlich) von Netbeans kompiliert (?) ohne Fehler, aber nicht ausgeführt. Die lakonische Konsole Ausdruck
Fehler: Hauptklasse einfach.Einfach konnte nicht gefunden oder geladen
werden
("Fehler: Hauptklasse konnte nicht gefunden oder geladen werden")
Umgebung:
- jdk: jdk-8-ea-bin-b102-windows-i586-08_aug_2013.exe
- Netbeans 7.4 beta, bundle aus 14.7.2013. Nicht sicher, ob das die neueste ist, konnte nicht download der Netbeans-Website (bekam einen "content encoding-Fehler" bei einem Klick auf den download-link)
BTW, dachte, der Verwendung von Netbeans, nur weil es bereits Unterstützung für jdk8 (wenn nicht netbeans, wer sonst 😉 - die eclipse-beta-preview von efxclipse hat ein ähnliches Problem (kompiliert, aber nicht ausgeführt Beispiel). Also definitiv raus aus meiner Komfort-zone, vielleicht ein paar ganz blöde Fehler meinerseits... ?
package simple;
import java.util.ArrayList;
import java.util.List;
import java.util.function.Predicate;
public class Simple {
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
List<Member> members = createMembers();
//implement predicate directly, runs fine
// Predicate<Member> predicate = new Predicate<Member>() {
// public boolean test(Member member) {
// return member.getAge() >= 18;
// }
// };
//predicate converted to lambda, fails to run
//"class couldn't be found"
Predicate<Member> predicate = (Member member) -> member.getAge() >= 18;
for (Member member : members) {
if (predicate.test(member)) {
member.printMember();;
}
}
}
public static class Member {
private String name;
private int age;
public Member(String name, int age) {
this.name = name;
this.age = age;
}
public int getAge() {
return age;
}
public void printMember() {
System.out.println(name + ", " + getAge());
}
}
private static List<Member> createMembers() {
List<Member> members = new ArrayList<>();
members.add(new Member("Mathilda", 45));
members.add(new Member("Clara", 15));
members.add(new Member("Gloria", 18));
return members;
}
}
Nein, ich hasse den Befehl Linie noch mehr als Netbeans 😉 Neugierig: ist das Beispiel (mit der lambda) führen in Ihrem Kontext, entweder IDE oder Kommandozeile?
Es läuft wunderbar auf IntelliJIdea. Naja, das problem ist irgendwo anders. Sie sind wahrscheinlich versuchen, führen Sie eine andere Datei. Die Fehlermeldung, die Sie bekommen, suggeriert diese nur. Vergewissern Sie sich, läuft die gleiche Datei.
versucht, die (Art von): es ist das einzige mit diesem Namen - seltsam (für mich), dass gerade in den Kommentaren des lambda-und einkommentieren der eingegebenen out-Prädikat lässt es laufen. Vermute, das ist in der Tat etwas ähnlich dumm (eine andere Datei), obwohl
InformationsquelleAutor kleopatra | 2013-08-23
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ihre code-Beispiel fehlt die printMembers () - Methode, aber das scheint nicht das eigentliche problem. Sie liefen in ein Netbeans-bug ich lief in heute als auch. Es scheint, dass die Netbeans-Entwickler markiert diese über vier Jahre alte bug als "gelöst", aber die Lösung ist immer noch die gleiche: Sie haben zu deaktivieren die "Compile on Save" - Optionen in den Einstellungen (Projekt-Eigenschaften/Erstellen/Kompilieren) und kompilieren Sie dann manuell (z.B. mit F9). Dann funktioniert es.
Mit der option nicht deaktiviert ist, sehen Sie die class-Dateien, die erstellt werden, wenn Sie sagen: "Clean and Build" aber plötzlich verschwinden, wenn Sie sagen, Netbeans, um den code auszuführen.
Als nächsten Schritt schlage ich vor, den code-Verbesserung durch Josh M, die ist, wie Sie wirklich nutzen sollten lambdas.
Ich fand die Lösung hier: stackoverflow.com/questions/3851592/..., aber natürlich erkennen, dass das verschwinden von Klassen war der schwierige Teil. Einen Fehler zu erwähnen, verschwinden die Klassen zusammen mit, die option ist unter netbeans.org/bugzilla/show_bug.cgi?id=163169
vielen Dank für die details! Kommentiert das doppelte, berichtet behoben werden: netbeans.org/bugzilla/show_bug.cgi?id=151845
InformationsquelleAutor Holger
Ist nicht notwendig, sollten Sie versuchen, etwas wie das zu tun:
members.stream().filter(m -> m.getAge() >= 18).forEach(Member::printMember);
InformationsquelleAutor Josh M