Sep 11, 2008
J2SE 7.0 の closure で遊んでみた
先日構築した J2SE 7.0 EA で closure の動作環境で早速遊んでみた。
サンプルコード(0)
まずは引数を受け取って戻り値を返す closure。
public class Test2 {
public Test2(){
super();
}
public static void main(final String[] args) {
int result = {int arg => arg * arg}.invoke(3);
System.out.println(result);
}
}
>java.bat Test2 9
サンプルコード(1)
次に、参照型の引数を受け取って、参照型の戻り値を返す closure。
public class Test3 {
public Test3(){
super();
}
public static void main(final String[] args) {
Comparee c0 = new Comparee(0);
Comparee c1 = new Comparee(1);
Comparee result = {Comparee c0, Comparee c1 =>
c0.getValue() >= c1.getValue() ? c0 : c1}.invoke(c0, c1);
System.out.println("" + result.getValue());
}
public static class Comparee {
private final int value;
public Comparee(final int value){
super();
this.value = value;
}
public int getValue(){
return this.value;
}
}
}
>java.bat Test3 1
サンプルコード(2)
既存のインタフェース(Comparable)を暗黙で実装したとみなされる closure。 簡単な Comparable の実装は楽になるな。
import java.util.List;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
public class Test4 {
public Test4(){
super();
}
public static void main(final String[] args) {
List<Comparee> list = new ArrayList<Comparee>();
list.add(new Comparee(1));
list.add(new Comparee(3));
list.add(new Comparee(0));
list.add(new Comparee(2));
Comparator<Comparee> comparator =
{Comparee c0, Comparee c1 => c0.getValue() - c1.getValue()};
System.out.println("" + list);
Collections.sort(list, comparator);
System.out.println("" + list);
}
public static class Comparee {
private final int value;
public Comparee(final int value){
super();
this.value = value;
}
public int getValue(){
return this.value;
}
public String toString(){
return "" + this.value;
}
}
}
>java.bat Test4 [1, 3, 0, 2] [0, 1, 2, 3]
サンプルコード(3)
closure を引数で受け取るメソッド。
public class Test5 {
public Test5(){
super();
}
public static void main(final String[] args) {
invoker({String message, int count =>
for(int i = 0; i < count; i++){
System.out.print("" + message);
}
System.out.println();
});
invoker({String message, int count =>
for(int i = 0; i < count; i++){
System.out.print("-" + message);
}
System.out.println();
});
}
public static void invoker({String, int => void} invokee){
invokee.invoke("*", 5);
}
}
>java.bat Test5 ***** -*-*-*-*-*
サンプルコード(4)
closure を実装するクラス。
public class Test6 {
public Test6(){
super();
}
public static void main(final String[] args) {
check(new MyChecker(), 5);
check(new MyChecker(), -1);
}
public static void check(final {int => boolean} f, final int i) {
System.out.println("" + f.invoke(i));
}
public static class MyChecker implements {int => boolean} {
public MyChecker(){
super();
}
public boolean invoke(final int i) {
return i < 0;
}
}
}
>java.bat Test6 false true
TrackBack ping me at
http://www.in-vitro.jp/blog/index.cgi/Dolphin/20080911_01.trackback
writeback message: Ready to post a comment.
