yojikのlog

yojikのブログです

Javaのクロージャが関数型言語っぽくなってる件について

ひさしぶりにチェックしてみたら結構いい感じになってた
http://www.javac.info/closures-v05.html
関数型の導入がかっちょいい。例えば、intを2つ引数にとって合計してintを返却する関数ならば、以下のように定義する。

{int,int =>int} add = {int x ,int y => x + y };

returnまで省略されてる。もうJavaとは思えない感じ*1。ただ動的言語よりはコンパイル時にいろいろチェックできる方向性が見えて、そこらへんはJavaらしさを感じる。右辺のintぐらいは型推論しろとは思うけど。
ここまで来たら、レガシーJavaとは別物という感じでガンガンいっちゃえばいいんじゃねと思った。
例えばメソッドの定義もこれでやるとか。。

//以下は妄想なので、仕様を都合のいいように改変してます
//(少しScalaっぽく。Scalaさんはもっと評価されていい)
public class Sample {
  public property {int,int =>int} add = { x, y  => x + y };
} 
//クライアントでは。。
Sample s = new Sample();
s.add(1,2); 

//メソッドだけ取り出すとか
{int,int => int} add = s#add
add(1,2) 
//↑thisの扱いが微妙になりそうな気がしますが...

//カリー化できるとか
{int => int} cadd = s.add(1);
cadd(2) // =>3
//↑これは多分無理だ。メソッドのオーバーロードとの兼ね合いが...

もう新言語作るぐらいの勢いで!!
ちなみに新言語といえばJavaFXScriptの文法はイマイチ好きになれない。構文糖が多すぎて微妙に一貫性が無い気がするんだよなー。個人的にGroovyに感じる違和感と似ている。*2

*1:内部的には匿名クラスが作られているイメージなんだろうけど

*2:GroovyよりはJRubyの方がシンプルでよさげ感じる