最后决定开始对 jdk8 的新特性进行一些实验,即教程后面的 lambda 表达式。为方便起见,我对示例进行了精简,请参见下面的 SSCCE。
键入谓词运行良好,将其重构为 Netbeans 编译(?)建议(并实际完成)的 lambda 表达式,没有错误,但不运行。简洁的控制台打印输出是
Fehler: Hauptklasse simple.Simple konnte nicht gefunden oder geladen werden
(“错误:无法找到或加载主类”)
环境:
- jdk:jdk-8-ea-bin-b102-windows-i586-08_aug_2013.exe
- Netbeans 7.4 beta,2013 年 7 月 14 日捆绑。不确定这是否是最新的,无法从 Netbeans 站点下载(单击其下载链接时出现“内容编码错误”)
顺便说一句,考虑使用 Netbeans 只是因为它已经支持 jdk8(如果不是 netbeans,还有谁 ;-) - efxclipse 的 eclipse beta 预览版有类似的问题(编译但不运行示例)。所以绝对是在我的舒适区之外,可能是我的一些非常愚蠢的错误......?
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;
}
}