kmizuの日記

プログラミングや形式言語に関係のあることを書いたり書かなかったり。

Scala 2.12.0-M4とJava 8 Streamで遊んでみる

Scala 2.12.0-M4はまだ正式リリースはされていませんが、既に各種バイナリはpublishされており、sbtに次のようにscalaVersionを書いてあげればふつうに使うことができます。

scalaVersion := "2.12.0-M4"

さて、Scala 2.12の一つの目玉がSAM Type(Single Abstract Method Type)変換です。これは、Java 8で可能になった、無名関数を抽象メソッドを一つだけ持つインタフェース型に変換できるようにするものです。また、同時に、invokedynamicを使った実装も入ったことによって、これまで、無名関数一つに付きクラスファイル一つが生成されていた状況が大幅に改善されることになります(M3と同じ部分も多くあると思いますが、せっかくfeature completeになったのであえて書いてみることにしました)。

さて、SAM Typeへの変換ができるようになったので、せっかくなのでJava 8のStream APIを使ってみることにしました。コードは次のような感じです:

gist.github.com

試してみて気づいたのですが、SAM Type変換に関して、これが仕様なのかM4時点での制限かはわかりませんが、Stream[String]に対してmapメソッドを呼び出す際に、型パラメータStringを明示しないとコンパイルエラーになってしまいました(エラーメッセージをみると、どうもワイルドカード絡みの推論がうまく行っていない気がします)。この辺の罠があるので、現時点でScalaからJava 8 Stream APIを使うのは面倒ですが、推論がうまく行くようになれば実用的に使うことができるのではないかと思います。