最后决定开始对jdk8的新功能进行一些实验,即lambda expressions following the tutorial。为方便起见,我删除了示例,请参阅下面的SSCCE。
键入谓词只是运行正常,将其重构为一个lambda表达式,如Netbeans编译(实际完成)编译(?)没有错误,但不运行。简洁的控制台打印输出
Fehler:Hauptklasse simple.Simple konnte nicht gefunden oder geladen werden
(“错误:无法找到或加载主类”)
环境:
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;
}
}
答案 0 :(得分:2)
这没有必要,你应该尝试做这样的事情:
members.stream().filter(m -> m.getAge() >= 18).forEach(Member::printMember);
答案 1 :(得分:2)
您的代码示例缺少printMembers()方法,但这似乎不是真正的问题。您遇到了我今天遇到的Netbeans错误。似乎Netbeans开发人员将这个超过四年的bug标记为“已解决”,但解决方案仍然相同:您必须在设置(项目属性/构建/编译)中关闭“编译保存”选项,然后手动编译(例如按F9)。然后就行了。
如果未禁用该选项,您将在显示“清理并生成”时创建的类文件,但在告诉Netbeans运行代码时突然消失。
作为下一步,我建议Josh M改进代码,这就是你应该如何使用lambdas。