NetBeans 8 開発版で JDK 8 EA を使ってみた

まだまだ遠いけど、手が届きそうなところまで近づいてきた JDK 8 を試してみます。

統合開発環境を使って動かせるようにも成りつつあるようです。

IntelliJ12でJDK8のlambda

Eclipse で Java8!

そこで我らがヒーロー NetBeans はどういった状況なのか? さっそく試してみました。

次期リリース予定の開発版をダウンロードしてインストールしてみました。

JDK 8 は Java™ Platform, Standard Edition 8 Early Access with Lambda Support と

JDK™ 8 Early Access Releases があります。

後者は前者の成果物を一部マージしたものとなっているようです。(たぶん・・・)

現在は Build b79 となっています。

Java™ Platform, Standard Edition 8 Early Access with Lambda Support を使って NetBeans をインストールしたのですが、

ちょっと問題が発生したので JDK™ 8 Early Access Releases に切り替えました。

JDK の変更は設定ファイルをちょこっと書き換えるだけで簡単にできるので気にしなくていいですね。

1

それでは The Java Tutorials を試してみましょう。

jp\yucchi\Member.java
package jp.yucchi;

import java.util.Date;
import java.util.Calendar;
import java.util.GregorianCalendar;

public class Member {

    public enum Sex {

        MALE, FEMALE
    }
    String name;
    Calendar birthday;
    Sex gender;
    String emailAddress;

    Member(String nameArg, Calendar birthdayArg,
            Sex genderArg, String emailArg) {
        name = nameArg;
        birthday = birthdayArg;
        gender = genderArg;
        emailAddress = emailArg;
    }

    public int getAge() {
        Calendar today = GregorianCalendar.getInstance();
        int age = today.get(Calendar.YEAR) - birthday.get(Calendar.YEAR);
        if ((birthday.get(Calendar.MONTH) > today.get(Calendar.MONTH))
                || (birthday.get(Calendar.MONTH) == today.get(Calendar.MONTH)
                && birthday.get(Calendar.DAY_OF_MONTH)
                > today.get(Calendar.DAY_OF_MONTH))) {
            age--;
        }
        return age;
    }

    public void printMember() {
        System.out.println(name + ", " + this.getAge());
    }

    public Sex getGender() {
        return gender;
    }

    public String getName() {
        return name;
    }

    public String getEmailAddress() {
        return emailAddress;
    }
}
jp\yucchi\RosterTest.java
package jp.yucchi;

import java.util.ArrayList;
import java.util.GregorianCalendar;
import java.util.List;
import java.util.function.Block;

import java.util.function.Predicate;

public class RosterTest {

    interface CheckMember {

        boolean test(Member p);
    }

    /**
     * @param args the command line arguments
     */
    public static void main(String... args) {
        List roster = new ArrayList<>();
        roster.add(
                new Member(
                "Fred",
                new GregorianCalendar(1980, 6, 20),
                Member.Sex.MALE,
                "fred@example.com"));
        roster.add(
                new Member(
                "Jane",
                new GregorianCalendar(1990, 7, 15),
                Member.Sex.FEMALE, "jane@example.com"));
        roster.add(
                new Member(
                "George",
                new GregorianCalendar(1991, 8, 13),
                Member.Sex.MALE, "george@example.com"));
        roster.add(
                new Member(
                "Bob",
                new GregorianCalendar(2000, 9, 12),
                Member.Sex.MALE, "bob@example.com"));

        for (Member p : roster) {
            p.printMember();
        }

        System.out.println("\n20歳以上のメンバー:");
        printMembersOlderThan(roster, 20);
        System.out.println();

        System.out.println("14歳以上、30歳未満:");
        printMembersWithinAgeRange(roster, 14, 30);
        System.out.println();

        System.out.println("Members who are eligible for Selective Service:");

        class CheckMemberEligibleForSelectiveService implements CheckMember {

            public boolean test(Member p) {
                return p.getGender() == Member.Sex.MALE
                        && p.getAge() >= 18
                        && p.getAge() <= 25;
            }
        }

        printMembers(
                roster, new CheckMemberEligibleForSelectiveService());

        System.out.println();

        System.out.println("Members who are eligible for Selective Service "
                + "(anonymous class):");

        printMembers(
                roster,
                new CheckMember() {
            public boolean test(Member p) {
                return p.getGender() == Member.Sex.MALE
                        && p.getAge() >= 18
                        && p.getAge() <= 25;
            }
        });

        System.out.println();

        System.out.println("Members who are eligible for Selective Service "
                + "(lambda expression):");

        printMembers(
                roster, (Member p)  -> p.getGender() == Member.Sex.MALE
                && p.getAge() >= 18
                && p.getAge() <= 25);

        System.out.println();

        System.out.println("Members who are eligible for Selective Service "
                + "(with Predicate parameter):");

        printMembersWithPredicate(
                roster, p  -> p.getGender() == Member.Sex.MALE
                && p.getAge() >= 18
                && p.getAge() <= 25);

        System.out.println();

        System.out.println("Members who are eligible for Selective Service "
                + "(with Predicate and Block parameters):");

        processMembers(
                roster,
                p  -> p.getGender() == Member.Sex.MALE
                && p.getAge() >= 18
                && p.getAge() <= 25,
                p  -> p.printMember());

        System.out.println();

        System.out.println("Members who are eligible for Selective Service "
                + "(with Predicate, Block, and Mapper parameters):");

//        processMembersWithMapper(
//            roster,
//            p -> p.getGender() == Member.Sex.MALE
//                && p.getAge() >= 18
//                && p.getAge() <= 25,
//            p -> p.getEmailAddress(),
//            email -> System.out.println(email)
//        );



    }

    private static void printMembersOlderThan(List roster, int age) {
        for (Member p : roster) {
            if (p.getAge() >= age) {
                p.printMember();
            }
        }

    }

    private static void printMembersWithinAgeRange(List roster, int low, int high) {
        for (Member p : roster) {
            if (low <= p.getAge() && p.getAge() < high) {
                p.printMember();
            }
        }

    }

    public static void printMembers(
            List roster, CheckMember tester) {
        for (Member p : roster) {
            if (tester.test(p)) {
                p.printMember();
            }
        }
    }

    public static void printMembersWithPredicate(
            List roster, Predicate tester) {
        for (Member p : roster) {
            if (tester.test(p)) {
                p.printMember();
            } else {
            }
        }
    }

    public static void processMembers(
            List roster,
            Predicate tester,
            Block block) {
        for (Member p : roster) {
            if (tester.test(p)) {
//                block.apply(p);
                block.accept(p);
            }
        }
    }
//     public static void processMembersWithMapper(
//        List roster,
//        Predicate tester,
//        Mapper mapper,
//        Block block) {
//        for (Member p : roster) {
//            if (tester.test(p)) {
//                String data = mapper.map(p);
//                block.accept(data);
//            }
//        }
//    }
}

コメントアウトしてあるところがあるのですが Mapper インターフェースが無いよって言われます。

JDK を変更しても一緒だったので何か変更されたのか、変更中なのかもしれません。

とりあえずここまではチュートリアル通りに動くようです。

一部コードは変更してあります。

さぁ、それでは、NetBeans の Lambda Expression 対応状況をみてみましょう。

このような匿名クラスを使ってるのをみつけると

2

このように Lambda Expression に変更できますよって親切に教えてくれます。

3

Lambda 使っちゃいますよってポチッってすると

4

これからの Java に変更されます。

5

チュートリアルで Lambda Expression を使う場合のコードと同じですね。(^-^)

6

おまけとして、Java™ Platform, Standard Edition 8 Early Access with Lambda Support を使った場合は

このように Functional Operation をお勧めしてくれます。

なんて親切なんだろう。

7

で、お勧めに従って Use Functional Operation をポチッとクリックすると

8

素敵ですね。拡張 for 文から見慣れない forEach 文を使った構文に変更されてます。

9

filter() を使えばいろいろ便利に使えそうな予感がします。

チュートリアルの充実と JDK 8 及び NetBeans の熟成が楽しみです。(*^O^*)

Hatena タグ: ,