Javaにクロージャは必要か?

Java言語の父であるJames Gosling氏が先月末、ブログでJavaにclosuresを導入したいという話をしていました(http://blogs.sun.com/jag/entry/closures)。Gosling氏によると、これまで諸般の事情によりJavaにはclosuresを採り入れることができなかったが、将来のリリースでサポートしたいということのようです。(参照:http://journal.mycom.co.jp/articles/2006/08/23/java7closuer/)

これに対する反響は大きく、Gosling氏のブログのコメント欄には様々な意見が書き込まれています。
書き込まれている意見をみると、無条件に賛成、反対ではないが現在のプロポーザルでは複雑すぎて使いにくい、難しくなるだけだから反対、使いたかったらclosuresをサポートしている言語(JRubyなど)をJVM上で使えばいいと賛否両論です。
ちなみに、クロージャがどういうものかというのを眺めてみると、、、Martin Fowler氏がLambda(邦訳:http://capsctrl.que.jp/kdmsnr/wiki/bliki/?cmd=view&p=Closure&key=closure)やCollection Pipeline(邦訳:http://capsctrl.que.jp/kdmsnr/wiki/bliki/?cmd=view&p=CollectionClosureMethod&key=closure)などでクロージャに言及しているのですが、この中で、Rubyを使う理由はクロージャがあるからだと言っています。

Closures have been around for a long time. I ran into them properly for the first time in Smalltalk where they're called Blocks. Lisp uses them heavily. They're also present in the Ruby scripting language - and are a major reason why many rubyists like using Ruby for scripting.(Lambdaから引用)

In recent years I've done a lot of Ruby programming. One of the main things that got me hooked into Ruby was the fact that it has these powerful collection methods, which Ruby can have since ruby does have closures in its language.(Collection Pipelineから引用)

Fowler氏の言葉を借りると、クロージャとは"a closure is a block of code that can be passed as an argument to a function call"というように、"引数に関数を書ける"もの、つまり、現在のJavaには無い新しい概念です。
クロージャを使うと、例えば、Rubyでは

managers = []
for e in employees
  if e.manager?
    managers << e 
  end
end

と書く代わりに

managers = employees.select {|e| e.manager?}

と書けるわけです(いずれも、Collection Pipelineから引用)。Rubyのコードをながめ始めたころは、なんとも理解しがたい表記でどう解釈すればいいのかとまどいましたが、なれれるにしたがって便利そうだと感じられるようになりました。
では、現在のJavaで"引数に関数を書ける"ようにするのは不可能なのか、というとそうでもなく、anonymous inner classを使えば、クロージャに近いことはできます。
IBM developerWorksに掲載されている"Java – IBM Developer – IBM Developer"という記事を見ると、Spring Frameworkではanonymous inner classを使ってクロージャを利用していると説明されています。そのサンプルコードとして、

JdbcTemplate template = new JdbcTemplate(dataSource);
final List names = new LinkedList(); 
template.query("SELECT id,name FROM types ORDER BY name",
                           new RowCallbackHandler() {
                               public void processRow(ResultSet rs) 
                                     throws SQLException
                               {
                                  names.add(rs.getString(1));
                               } 
                            }); 

が記載されています(Listing 14.)。Fowler氏もかつてはannonymous inner classで実装しようとしたとBlikiで書いています。
ただ、Rubyのコード(Listing 11.)

require 'mysql'

db=Mysql.new("localhost", "root", "password")
db.select_db("database")

result = db.query "select * from words"
result.each {|row| do_something_with_row}

db.close

と比べると、シンプルさはなく、逆に複雑になってしまっています。
ということで、Neal Gafter(http://gafter.blogspot.com/)、Mark Mahieu(http://markmahieu.blogspot.com/)などが言語レベルでクロージャをサポートしようということで、プロポーザルを行っています(Closures (Lambda Expressions) for the Java Programming Language)。
プロトタイプをダウンロードして、クロージャを使っているコードを見ると

public class Clarkson4 {
    static void invoke(Runnable r) { r.run(); }
    public static void main(String[] args)
    {
        invoke({=>
        Integer i = 12;
        System.out.println(i);
        });
    }
}

や、

public class Mahieu4 {

    interface Chainable {
        Chainable call();
    }

    public static void main(String[] args) {
        Chainable c = { => { => null } };
        c.call().call();
        System.out.println("done");
    }
}

など、いろいろありました。2つめ例はRubyのchaining block

managersOffices = employees.select{|e| e.manager?}.
                            map   {|m| m.office}

(Collection Pipelineから引用)と比べると、まだ追い付いていない感じはしますが、annonymous inner classで実装するよりはかなりいい感じです。(どちらかというとFluentInterfaceに近い感じもしますが)
まだ、プロトタイプでありこれから改良されていくところだとはいえ、JVMに修正を加えてまでRubyなどのクロージャをサポートしているダイナミック言語を無理なく動かそうという動きもあり、ユーザとしてはどちらがいいのか悩むところではないでしょうか。
個人的にはクロージャを使うならRuby on JVM派ですね。