1

最後に、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;
    }

}
4

2 に答える 2

3

コード例には printMembers() メソッドがありませんが、これは実際の問題ではないようです。あなたは、私が今日遭遇した Netbeans のバグにも遭遇していました。Netbeans 開発者は、この 4 年以上前のバグを「解決済み」とマークしたようですが、解決策は同じです。設定 ([プロジェクトのプロパティ]/[ビルド]/[コンパイル]) で [保存時にコンパイル] オプションをオフにする必要があります。手動でコンパイルします (例: F9 を押します)。その後、動作します。

オプションを無効にしないと、「クリーン アンド ビルド」と言うとクラス ファイルが作成されますが、Netbeans にコードを実行するように指示すると突然消えます。

次のステップとして、ラムダを実際に使用する方法である Josh M によるコードの改善を提案します。

于 2013-08-23T15:35:20.940 に答える