NetBeans 8 開発版で JDK 8 EA を使ってみた
まだまだ遠いけど、手が届きそうなところまで近づいてきた JDK 8 を試してみます。
統合開発環境を使って動かせるようにも成りつつあるようです。
そこで我らがヒーロー 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 の変更は設定ファイルをちょこっと書き換えるだけで簡単にできるので気にしなくていいですね。
それでは The Java Tutorials を試してみましょう。
jp\yucchi\Member.java |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 |
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 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 |
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<Member> 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<Member> roster, int age) { for (Member p : roster) { if (p.getAge() >= age) { p.printMember(); } } } private static void printMembersWithinAgeRange(List<Member> roster, int low, int high) { for (Member p : roster) { if (low <= p.getAge() && p.getAge() < high) { p.printMember(); } } } public static void printMembers( List<Member> roster, CheckMember tester) { for (Member p : roster) { if (tester.test(p)) { p.printMember(); } } } public static void printMembersWithPredicate( List<Member> roster, Predicate<Member> tester) { for (Member p : roster) { if (tester.test(p)) { p.printMember(); } else { } } } public static void processMembers( List<Member> roster, Predicate<Member> tester, Block<Member> block) { for (Member p : roster) { if (tester.test(p)) { // block.apply(p); block.accept(p); } } } // public static void processMembersWithMapper( // List<Member> roster, // Predicate<Member> tester, // Mapper<String, Member> mapper, // Block<String> block) { // for (Member p : roster) { // if (tester.test(p)) { // String data = mapper.map(p); // block.accept(data); // } // } // } } |
コメントアウトしてあるところがあるのですが Mapper インターフェースが無いよって言われます。
JDK を変更しても一緒だったので何か変更されたのか、変更中なのかもしれません。
とりあえずここまではチュートリアル通りに動くようです。
一部コードは変更してあります。
さぁ、それでは、NetBeans の Lambda Expression 対応状況をみてみましょう。
このような匿名クラスを使ってるのをみつけると
このように Lambda Expression に変更できますよって親切に教えてくれます。
Lambda 使っちゃいますよってポチッってすると
これからの Java に変更されます。
チュートリアルで Lambda Expression を使う場合のコードと同じですね。(^-^)
おまけとして、Java™ Platform, Standard Edition 8 Early Access with Lambda Support を使った場合は
このように Functional Operation をお勧めしてくれます。
なんて親切なんだろう。
で、お勧めに従って Use Functional Operation をポチッとクリックすると
素敵ですね。拡張 for 文から見慣れない forEach 文を使った構文に変更されてます。
filter() を使えばいろいろ便利に使えそうな予感がします。
チュートリアルの充実と JDK 8 及び NetBeans の熟成が楽しみです。(*^O^*)
Trackback URL