最後に、jdk8 の新機能、つまりチュートリアルに続くラムダ式について少し実験を始めることにしました。便宜上、例を簡略化しました。以下の SSCCE を参照してください。
述語を入力すると問題なく実行され、Netbeans によって提案された (そして実際に実行された) ラムダ式にリファクタリングすると、エラーなしで (?) コンパイルされますが、実行されません。簡潔なコンソールの出力は
Fehler: Hauptklasse simple.Simple konnte nicht gefunden または geladen werden
(「エラー: メイン クラスが見つからないか、ロードできませんでした」)
環境:
- jdk: jdk-8-ea-bin-b102-windows-i586-08_aug_2013.exe
- Netbeans 7.4 ベータ版、14.7.2013 からバンドル。それが最新かどうかわからない、Netbeans サイトからダウンロードできなかった (ダウンロード リンクをクリックしたときに「コンテンツ エンコーディング エラー」が発生した)
ところで、すでに jdk8 をサポートしているという理由だけで Netbeans を使用することを考えました (netbeans でない場合、他に誰が ;-) - efxclipse の Eclipse ベータ プレビューにも同様の問題があります (例をコンパイルするが実行しない)。つまり、間違いなく私の快適ゾーンから外れているので、おそらく私の側の非常に愚かな間違いです...?
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;
}
}